【问题标题】:CaliburnMicro IsVisibleChanged does not fireCaliburn Micro IsVisibleChanged 不会触发
【发布时间】:2019-12-27 16:33:17
【问题描述】:

事件IsVisibleChanged 无法路由到 ViewModel。可能是什么原因?

如果我使用 CodeBehind 将事件作为普通 WPF 事件(没有 Caliburn Message.Atach)进行测试,则事件会按预期触发。如果我正在测试 Caliburn Message.Atach 与 UserControl 的其他事件(如 LayoutUpdated),它们会像预期的那样与 ViewModel 一起工作。但我无法让IsVisibleChanged 被我的ViewModel 解雇。

查看

<UserControl x:Class="MySetupDeviceConfig.Views.SetupDeviceConfigView" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:cal="http://www.caliburnproject.org"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" Visibility="{Binding Visibility}"
         d:DesignHeight="450" d:DesignWidth="800" 
         cal:Message.Attach="[Event IsVisibleChanged] = [Action UcIsVisibleChanged];">
    <Grid>
    ...

视图模型

public class SetupDeviceConfigViewModel : Screen
{
    private Visibility _Visibility;
    private ILogger Log { get; set; }
    public Visibility Visibility { get => _Visibility; set { _Visibility = value; NotifyOfPropertyChange(); } }

    // ...

    public void UcIsVisibleChanged()
    {
        Log.LogInformation("IsVisibleChanged");
    }

使用 Caliburn.Micro v4.0.62-alpha 和 CaliburnMicro v3.2.0 测试

改变例如到具有相同动作/功能映射的视图中的Loaded 事件-> 它可以工作。所以没有类型不匹配...

    cal:Message.Attach="[Event Loaded] = [Action UcIsVisibleChanged];">

【问题讨论】:

    标签: c# events caliburn.micro


    【解决方案1】:

    您的财产不需要称为IsVisible 而不是Visibility 吗?或者,将对NotifyOfPropertyChange 的调用从默认更改为NotifyOfPropertyChange("IsVisible")

    【讨论】:

      【解决方案2】:

      尝试将操作放在 UserControl 内的第一个元素(Grid)上,而不是放在 UserControl 本身上。我自己试过了,它似乎可以在 Grid 上工作,但不能在 UserControl 本身上工作,可能是 Caliburn 错误?

      我还注意到,当我在代码隐藏中切换网格的可见性时,该事件没有被触发,但是当我将可见性依赖属性绑定到我的 ViewModel 中的一个属性时,它起作用了!似乎是 Caliburn 中的另一个错误。

      我认为将事件和绑定放置在 UserControl 内部的控件上而不是 UserControl 本身上通常是一种很好的做法。如果 UserControl 从外部隐藏,则其中的 Grid 无论如何都应该触发可见性事件,因此实际上没有区别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多