【问题标题】:MVVM WPF design related query : use of UserControlsMVVM WPF 设计相关查询:UserControls 的使用
【发布时间】:2010-08-10 10:58:41
【问题描述】:

我有一个与使用 MVVM 设计 WPF 相关的查询

这里是场景:

1> 我有一个 WPF 屏幕,其中包含各种用户控件,这些控件也可以在其他屏幕中重复使用。

2> 我可以为每个用户控件设置单独的 ViewModel 类吗,在这种情况下什么可能是理想的设计

3> 我应该根据单个屏幕还是 UserControls 来分离我的 Viewmodel。

4> 如果我基于 UserControls 创建单独的视图模型,我应该如何集成它。

有没有关于这个的设计指南!!

紧急帮助表示赞赏..

【问题讨论】:

    标签: wpf


    【解决方案1】:

    这篇文章描述了我在某些情况下所做的事情,我不知道这是否是最佳实践,但它对我有用。

    我为我的 Window 创建了包含所有用户控件的 ViewModel,因此这称为 ContainerViewModel,我创建了该 Viewmodel 的一个实例并将其放入 Window 的 DataContext 中。从那一刻起,所有用户控件都可以使用绑定访问该 ViewModel。 接下来要做的是在我的 ContainerViewModel 上为 everty UserControl 创建一个属性,该属性包含每个 UserControl 的 ViewModel。 然后使用绑定将用户控件 ViewModel 附加到用户控件的 DataContext 属性。

    视图模型和带有 2 个列表框而不是用户控件的窗口的示例: Viewmodel 类没有任何实现,只是显示概念的空类:

    public class ContainerViewModel
    {
        public ContainerViewModel()
        {
            ViewModelForControl1 = new Control1ViewModel();
            ViewModelForControl2 = new Control2ViewModel();
        }
    
        public Control1ViewModel ViewModelForControl1 { get; set; }
        public Control2ViewModel ViewModelForControl2 { get; set; }
    }
    public class Control1ViewModel { }
    public class Control2ViewModel { }
    

    窗口 xaml:

    <Window x:Class="ConfigHellp.UI.Windows.ContainerWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:vm="clr-namespace:ConfigHellp.UI.ViewModel"
            mc:Ignorable="d"
            DataContext="{DynamicResource ContainerViewModel}"  >
        <Window.Resources>
            <vm:ContainerViewModel x:Key="ContainerViewModel" d:IsDataSource="True" />
        </Window.Resources>
        <StackPanel>
    
            <ListBox DataContext="{Binding ViewModelForControl1}" />
            <ListBox DataContext="{Binding ViewModelForControl2}" />
        </StackPanel>
    </Window>
    

    【讨论】:

      【解决方案2】:

      这取决于将 UserControl 嵌入到环境中的复杂程度。如果您认为一次又一次地为您的用户控件构建视图模型逻辑需要付出很大的努力(这也是错误的一个很好的来源),您实际上应该将逻辑封装在您的控件的单个视图模型中。例如,如果用户控件是 ListItem,我通常建议您为控件构建自己的视图模型。

      基础设施将比:

      WPF 屏幕的通用视图模型,其中包含用户控件的视图模型实例。屏幕的那个 DataContext 将是一般的视图模型。用户控件的 DataContext 将是一个 Binding 到您的通用视图模型中用户控件视图模型的 PropertyPath。例如:

      在 WPF 屏幕中:

      <ListBox  DataContext="{Binding}" ItemsSource="{Binding Path=ItemList}">
          <ListBox.ItemTemplate>
               <yourControls:YourUserControl />
          </ListBox.ItemTemplate>
      </ListBox>
      

      在一般视图模型中:

      public class ScreenViewModel : INotifyPropertyChanged
      {
          private ObservableCollection<YourUserControlViewModel> _itemList = 
              new ObservableCollection<YourUserControlViewModel>();
      
          public ObservableCollection<YourUserControlViewModel> ItemList
          {
              get { return _itemList; }
              set { _itemList = value; }
          }
      }
      

      这将自动为您的通用视图模型的 ItemList 中的每个视图模型生成一个用户控件。

      【讨论】:

        猜你喜欢
        • 2017-12-22
        • 1970-01-01
        • 2013-01-02
        • 2016-04-01
        • 2011-08-02
        • 1970-01-01
        • 2022-01-23
        • 2017-03-01
        相关资源
        最近更新 更多