在为UserControls创建VM时,谁应该创建并设置VM



我对如何在MVVM中布局的代码感到有些困惑 - 如果我有一个带有相应VM类的UserControl,其他控件应该如何消耗我的USERCORTROL?

消费者应该直接与VM结合,还是我应该仅复制这些属性的子集,我想实际用作USerControl的依赖关系?

就此而言,是否应该将USERCORTROL的VM注入USERCORTROL的代码范围,或者是否应该使用此USERCORTROL的任何控件的VM作为依赖关系并将其绑定到USERCONTROL?

吗?

只是为了明确说明:假设我在USERCONTROL中有一个listBox,并将其在已使用MVVM实现的窗口中使用。但是我对USERCORTROL VM和相应绑定的实现感到困惑。

我认为理想的解决方案是通过USERCONTROL中的依赖项属性公开列表框的selectedItems,然后使用USERCONTROL的窗口将与这些结合。

或该窗口的VM应该引用VM作为属性,将其注入并直接与该属性结合?

应仅在UserControls中定义依赖性属性,或者可以/应该/应该在VM中定义它们?

我认为窗口将从窗口的XAML内部绑定,要么通过

{Binding ElementName=myUserControl, Path=SelectedItems}

{Binding Path=MyViewModel.SelectedItems} 

通过前者进行操作似乎更有意义,因为后者要求该视图知道另一个VM?

>其他控件如何消耗我的usercontrol?

仅在UserControl上通过裸露的依赖性属性。

>消费者应该直接与VM结合,还是我应该仅复制这些属性的子集,我想实际用作USERCONTROL的依赖关系?

每个控件都应该是一个独立的实体,不应有任何秘密握手(或来自)来使用控件。像您是Microsoft一样,想想设计,许多不同的用户将使用您的控件。因此,答案#1同样相关;想想一个独立的实体。

>我认为理想的解决方案是通过USERCONTROL中的依赖项属性揭示列表框的选择性,然后使用USERCONTROL的窗口将绑定到这些。

托管您的控件的窗口将具有一个视图模型,其中包含可观察到的数据项列表。这将保留用户控制将通过其依赖性属性绑定的数据。将其视为许多消费者的生产者模式。消费者是控件。控件是否具有VMS与主要程序的运行不重要;每个控制都是自己的岛屿。

在使用WPF和MVVM时,请记住您的View层只是一种用户友好的绘制ModelsViewModels的方式,而您的View实际上不是您的应用程序。您的View实际上必须了解有关数据层的基础知识,以便它可以定义如何绘制它。

因此,如果您的应用程序需要显示Items的列表并维护SelectedItem,则应在您的ViewModel或模型中,而不是在实际视图层中。

通常对我的UserControls是两件事之一:

  • 可以在没有特定DataContext的任何地方使用的独立UserControl,并且可以将DependencyProperties暴露于任何特定于控制的值。示例是Calendar控制或Popup控制

    之类的东西
    <local:MyUserControl Items="{Binding SomeItemList}" 
                         SelectedItem="{Binding SomeItem}" />
    
  • 或它们是仅与特定ViewModel一起使用的UserControl。这对我来说更为普遍。ViewModel是数据层某个地方的属性,并且我通常在应用程序中有一个隐式DataTemplate,以告诉WPF随时需要渲染该特定的ViewModel

    时使用UserControl
    <DataTemplate DataType="{x:Type local:SomeViewModel}">
        <local:MyUserControl />
    </DataTemplate>
    <ContentPresenter Content="{Binding SomeViewModelProperty}" />
    

另外,您绝对不应该从UserControl本身内部设置UserControlDataContext,因为UI层仅是您的数据层的UI表示(您的Models/ViewModels),并且通过设置数据从UserControl内部进行层,您正在制作它,以便UserControl不能用于绘制任何其他数据对象。

最新更新