【发布时间】:2011-10-14 02:10:20
【问题描述】:
您好,我正在构建一个 wpf 应用程序,其中一个屏幕将包含用于执行各种应用程序的不同用户控件。
我想知道在 MVVM 中执行此操作的正确过程?每个用户控件应该有自己的视图模型,还是应该绑定到主视图模型属性?
请提出一个好的方法。谢谢,
【问题讨论】:
标签: .net wpf mvvm wpf-controls binding
您好,我正在构建一个 wpf 应用程序,其中一个屏幕将包含用于执行各种应用程序的不同用户控件。
我想知道在 MVVM 中执行此操作的正确过程?每个用户控件应该有自己的视图模型,还是应该绑定到主视图模型属性?
请提出一个好的方法。谢谢,
【问题讨论】:
标签: .net wpf mvvm wpf-controls binding
当我使用 UserControl 时,我通过 DependencyProperties 传递数据。我的 UserControls 没有 ViewModels。 UserControls 仅以一种非常特殊的方式处理传递的数据。
但是,如果我的视图包含一些子视图,我希望每个子视图都有一个自己的模型。这些模型我会通过MainView的ViewModel的一个属性来绑定。
一些例子:
UserControl1,后面的代码:
public partial class UserControl1 : UserControl
{
public MyClass MyProperty
{
get { return (MyClass)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(MyClass), typeof(UserControl1), new UIPropertyMetadata(null));
public UserControl1()
{
InitializeComponent();
}
}
public class MyClass
{
public int MyProperty { get; set; }
}
以及视图中的用法,XAML:
<Window x:Class="Sandbox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Sandbox="clr-namespace:Sandbox">
<Grid>
<Sandbox:UserControl1 MyProperty="{Binding MyOtherPropertyOfTypeMyClassInMyViewModel, Mode=TwoWay}" />
</Grid>
希望对你有帮助
【讨论】:
好问题 - 但我认为没有一个直截了当的答案。
这在很大程度上取决于数据的形状。如果不同的用户控件是相同数据的不同视图,那么它们没有理由不能共享相同的 ViewModel...这是 MVVM 的驱动力之一 - 您可以将相同的 ViewModel 提供给不同的 View 以显示相同不同方式的数据。
但话又说回来,如果您的 ViewModel 开始膨胀并且没有太多重叠,那么将其分解为更小的 ViewModel。也许那时您的主 ViewModel 就更像是一个 ViewModel 管理器,其中包含一组 ViewModel 以适当地分发给各种用户控件?
【讨论】: