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);
所以玩 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);