MVVM WPF设计相关查询:使用UserControls

时间:2010-08-10 10:58:41

标签: wpf

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

以下是该方案:

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

2 - ;我可以为每个用户控件分别使用ViewModel类,在这种情况下可能是理想的设计

3>我应该根据个人屏幕还是在UserControls上分离我的Viewmodel。

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

有没有关于此的设计指南!!

紧急帮助赞赏..

2 个答案:

答案 0 :(得分:0)

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

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

viewmodels的示例和一个包含2个列表框而不是usercontrols的窗口: 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 { }

Window 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>

答案 1 :(得分:0)

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

基础设施将是:

WPF屏幕的常规视图模型,它保存用户控件的视图模型的实例。屏幕的 DataContext 将是一般的viewmodel。用户控件的 DataContext 将是一般视图模型中用户控件视图模型的 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; }
    }
}

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