我对如何在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
层只是一种用户友好的绘制Models
和ViewModels
的方式,而您的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
本身内部设置UserControl
的DataContext
,因为UI层仅是您的数据层的UI表示(您的Models
/ViewModels
),并且通过设置数据从UserControl
内部进行层,您正在制作它,以便UserControl
不能用于绘制任何其他数据对象。