Prism SetProptery没有解雇通知?

时间:2015-09-28 10:32:12

标签: c# wpf prism

所以玩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,如果我将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: 刚发现一些有趣的东西,如果我在LoadingVisibility = Visibility.Collapsed;中注释掉Subscribe,然后在xaml上添加一个按钮,然后点击事件,那么一切正常。

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

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

1 个答案:

答案 0 :(得分:1)

通常在使用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);