wpf - Prism 和 View 的多个实例

标签 wpf mvvm prism

我正在使用 Prism 编写 WPF 应用程序并面临以下困境:
我有一个显示 2 个区域的 View ,一个用于网格,另一个用于过滤器面板,它可以对网格中的项目进行高级过滤。

这些 View 由 Prism 发现并实例化到指定区域。
应用过滤器时,必须根据适当​​的过滤器更新网格。例如,这可以通过使用 Controller (如果 ViewModel 位于同一模块中)或使用事件(利用 EventAgragator)来实现。到现在为止还挺好。

我的问题是这个 View 可能在不同的窗口中有多个实例。因此,我需要知道过滤器的上下文,以便能够确定必须影响哪个网格。但是,ViewModel 实例彼此不知道。

如何最好地实现这一点?

最佳答案

你是如何填充这两个区域的?您的“父” View 是否明确调用 regionManager.RequestNavigate()在他们身上,或者你是否在应用程序启动期间将区域“修复”到他们的 View 中,使用regionManager.RegisterViewWithRegion() ?

对于前者,您的父 View 可以(比如说)生成一个 GUID,并在您调用 RequestNavigate() 时使用上下文参数将其传递给 subview 。 . View 可以在 OnNavigatedTo() 中获取该值。如果您使用 EventAggregator,您可以将 GUID 作为消息对象的属性公开,并在订阅时使用谓词方法重载,因此图形 View 仅接收包含预期 GUID 的消息。

如果您使用 RegisterViewWithRegion ,事情变得更加棘手。我知道您可以在区域的 XAML 中设置上下文值,因此遵循 GUID 的想法,并假设 VM 通过名为 MyViewGuid 的属性公开生成的 GUID 值:-

<ContentControl Regions:RegionManager.RegionName="Foo"
                Regions:RegionManager.RegionContext="{Binding MyViewGuid}"/>

我还没有找到一种简单的方法来获取 subview 模型的上下文值(假设在这种情况下不会调用它们的 INavigationAware 方法)。我使用了一种 hacky 方法 - 在 subview 的构造函数中,设置一个事件处理程序以更改父区域的上下文值:-
var regionContext = RegionContext.GetObservableContext(this);
regionContext.PropertyChanged += RegionContextOnPropertyChanged;

事件处理程序将是这样的,在我的脑海中: -
private void RegionContextOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
    var observableObject = sender as ObservableObject<object>;
    if (observableObject != null && observableObject.Value != null)
    {
         // Get the GUID value from the context and pass to the VM
         // (assuming the VM has a method called SetGuid().
         var myGuid = (Guid)observableObject.Value;
         (DataContext as MyViewModel).SetGuid(myGuid);
    }
}

希望我建议的东西可能有用......!

关于wpf - Prism 和 View 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23790467/

相关文章:

WPF 文本框保留可见插入符号

c# - 使用 TwoWay 将 string[] 绑定(bind)到 XAML

wpf - ViewModel 沟通问题

mvvm - Prism 6 和构造函数调用

wpf - 您如何处理在MVVM应用程序中大量增长的ModelView文件?

wpf - View 和 View 模型中的WPF MVVM按钮调用方法

c# - 如何在此模型中应用 MVVM 模式?

wpf - 如何在 WPF TextBox 上为无效的依赖属性显示红色边框?

c# - MvvmLight EventToCommand 不再工作

c# - 如何在 mvvm 中使用复合命令