MVVM WPF设计相关查询:用户控件的使用

MVVM WPF设计相关查询:用户控件的使用,wpf,Wpf,我有一个关于使用MVVM设计WPF的问题 以下是场景: 1> 我有一个WPF屏幕,其中包含各种用户控件,这些控件也可以在其他一些屏幕中重用 2> 我可以为每个用户控件单独设置ViewModel类吗?在这个场景中,什么是理想的设计 3> 我应该基于单个屏幕或用户控件分离Viewmodel吗 4> 如果我基于UserControl创建单独的viewmodels,我应该如何集成它 有没有关于这方面的设计指南 非常感谢您的紧急帮助。这篇文章描述了我在某些情况下所做的工作,我不知道这是否是一种最佳做法,但

我有一个关于使用MVVM设计WPF的问题

以下是场景:

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

2> 我可以为每个用户控件单独设置ViewModel类吗?在这个场景中,什么是理想的设计

3> 我应该基于单个屏幕或用户控件分离Viewmodel吗

4> 如果我基于UserControl创建单独的viewmodels,我应该如何集成它

有没有关于这方面的设计指南


非常感谢您的紧急帮助。

这篇文章描述了我在某些情况下所做的工作,我不知道这是否是一种最佳做法,但它对我有效

我为包含所有用户控件的窗口创建ViewModel,因此称为ContainerViewModel,我创建该ViewModel的一个实例,并将其放在窗口的DataContext中。从那时起,所有用户控件都可以通过绑定访问该ViewModel。 接下来要做的事情是在我的ContainerViewModel for everty UserControl上创建一个属性,该属性保存每个UserControl的ViewModel。 然后使用绑定将usercontrols ViewModel附加到Usercontrol的DataContext属性

viewmodels和包含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>

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

基础设施将比:

WPF屏幕的通用viewmodel,其中包含用户控件的viewmodels实例。屏幕的DataContext将是常规viewmodel。用户控件的DataContext将绑定到常规viewmodel中用户控件viewmodel的PropertyPath。e、 g:

在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; }
    }
}
公共类屏幕视图模型:INotifyPropertyChanged
{
私有ObservableCollection\u itemList=
新的可观察集合();
公共可观察收集项目列表
{
获取{return\u itemList;}
设置{u itemList=value;}
}
}
这将自动为常规视图模型的ItemList中的每个viewmodel生成用户控件