所以玩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
起作用?
答案 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);