Prism SetProptery 没有触发通知?

Prism SetProptery not firing Notification?

所以玩 PRISM 我有一个 Visibility 属性 的网格绑定到视图模型中的 属性 像这样。

Xaml

Grid Grid.RowSpan="2" Grid.ColumnSpan="3" Background="#7F808080" Visibility="{Binding LoadingVisibility}">

代码隐藏

private Visibility loadingVisibility = Visibility.Visible;

public Visibility LoadingVisibility
{
    get
    {
        return loadingVisibility;
    }
    set
    {
        SetProperty(ref loadingVisibility, value);
    }
}

现在如果我这样做 LoadingVisibility = Visibility.Collapsed;,网格不会消失并且仍然可见。

如果我然后在 SetProperty(ref loadingVisibility, value); 处设置断点,我可以看到 loadingVisibility 的原始值设置为 Visibile,并且我可以看到 value设置为 Collapsed。 如果我然后继续,我可以看到 loadingVisiblity 现在已经更改为 collapsed,这是应该的。在这一点上,我希望 Grid 得到通知,然后执行 'Get' 来检索值。这不会发生。

绑定有效,因为 Get 在加载时被调用,如果我将 private Visibility loadingVisibility = Visibility.Visible; 更改为 Collapsed 和 运行,网格开始不可见的代码。

所以我的问题是,SetProperty执行后,为什么Get没有执行?

编辑: 这样你就可以看到我在哪里设置 属性.

public ShellViewModel(IEventAggregator IEventAggregator)
{
      IEventAggregator.GetEvent<PubSubEvent<HardwareLoaded>>().Subscribe(x =>
      {
          if (!x.HardwareOK)
          {
              MessageBox.Show("There was an issue loading hardware. See Log");
          }

          LoadingVisibility = Visibility.Collapsed;           
       });
}

编辑 2: 刚刚发现一些有趣的东西,如果我在 Subscribe 中注释掉 LoadingVisibility = Visibility.Collapsed;,然后向 xaml 添加一个按钮,并像这样点击事件,那么一切正常。

private void Button_Click(object sender, RoutedEventArgs e)
{
      mvm.LoadingVisibility = Visibility.Collapsed;
}

所以现在我想问题是,为什么当两种方法都调用集合 属性 时,只有一个完全起作用并导致 Get 起作用?

经常在使用 EventAggregator 时,您正在处理 UI 线程。但是看到 HardwareLoaded 类型,我想到您可能正在检查另一个线程。正如我们所知,必须从 UI 线程更新绑定。通常您会使用 Dispather.BeginInvoke,但 Prism 的 EventAggregator 在 Subscribe 方法中有一个重载来告诉处理程序卸载到 UI 线程。

IEventAggregator.GetEvent<PubSubEvent<HardwareLoaded>>().Subscribe(x =>
{
    if (!x.HardwareOK)
    {
        MessageBox.Show("There was an issue loading hardware. See Log");
    }

    LoadingVisibility = Visibility.Collapsed;
}, ThreadOption.UIThread);