gpt4 book ai didi

wpf - MVVM 模式和嵌套 View 模型 - 通信和查找列表

转载 作者:行者123 更新时间:2023-12-03 10:15:30 26 4
gpt4 key购买 nike

我正在将 Prism 用于我正在创建的新应用程序。有几个查找列表将在应用程序的多个位置使用。因此,定义一次并在我需要该功能的任何地方使用它是有意义的。我当前的解决方案是使用类型化数据模板来呈现内容控件中的控件。

   <DataTemplate DataType={x:Type ListOfCountriesViewModel}>
<ComboBox ItemsSource={Binding Countries} SelectedItem="{Binding SelectedCountry"/> </DataTemplate>
<DataTemplate DataType={x:Type ListOfRegionsViewModel}>
<ComboBox ItemsSource={Binding Countries} SelectedItem={Binding SelectedRegion} /> </DataTemplate>

public class ParentViewModel
{
SelectedCountry get; set;
SelectedRegion get; set;
ListOfCountriesViewModel CountriesVM;
ListOfRegionsViewModel RgnsVM;
}

然后在我的窗口中,我有 2 个内容控件和其余控件
<ContentControl Content="{Binding CountriesVM}"></ContentControl>
<ContentControl Content="{Binding RgnsVM}"></ContentControl>
<Rest of controls on view>

目前我有这个工作,组合框的 SelectedItems 正在通过 EventAggregator 从 subview 模型发布事件,然后在父 View 模型中订阅这些事件。

我不确定这是不是最好的方法,因为我可以想象我很快就会结束很多事件,并且会变得笨拙。此外,如果我要在另一个窗口上使用相同的 View 模型,它将发布事件,并且订阅了该父 View 模型,这可能会产生意想不到的后果。

我的问题是:-
  • 这是将查找列表放在可以跨屏幕重复使用的 View 中的最佳方式吗?
  • 如何使绑定(bind)到 subview 模型的组合框在不使用事件/调解器的情况下在父 View 模型上设置相关属性。例如在这种情况下 SelectedCountry 例如?
  • 我正在尝试做的任何替代实现建议?

  • 我有一种感觉,我错过了一些明显的东西,而且信息太多,很难知道什么是正确的,因此我们将非常感激地接受任何帮助。

    最佳答案

    在您的场景中, parent 似乎知道 child 的类型。在这种情况下你不能只使用属性吗? :

    ListOfCountriesVM 公开了 SelectedCountry 的属性。

    在父 VM 中,SelectedCountry 的实现只返回 ListOfCountriesVM.SelectedCountry。

    您可以对任何知道它拥有 ListOfCountriesVM 的父 View 模型执行此操作。

    根据我的经验,消息/事件聚合实际上应该只在发布者不关心谁在听或有多少听众的情况下使用。例如:

  • 向应用程序中的其他模块发送通知
  • 发送通知以查看您无法保证存在的同一模块中的模型。

  • 在您的情况下,订阅者( parent )已经知道发布者( child )是谁,因此使用属性的简单解决方案似乎是最合适的。我不认为这种特殊情况需要基于消息传递或事件的解决方案。

    关于wpf - MVVM 模式和嵌套 View 模型 - 通信和查找列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783599/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com