Wpf UserControl和MVVM
我正在考虑为我的应用程序编写一个WPF用户控件。 我在我的应用程序中使用MVVM。
用户控件可能需要可以设置我的父视图的依赖项属性。 当使用MVVM时,其想法是父视图最终将在UserControls
DP与父视图的VM之间创建一个绑定)
由于VM不从DependencyObject
继承,所以需要在View类中创建Dependency Properties
。 这意味着在后面的XAML代码中添加代码。
我想知道是否可以提供有关如何在使用MVVM开发WPF应用程序时设计用户控件的建议...
案例1:如果你正在创建这个控件只是为了在应用程序中使用,那么你可以继续为它创建一个ViewModel
,但是你不需要创建DP,你的ViewModel
可以实现INotifyPropertyChanged
并且你的父Vm可以仍然绑定到他们。
在我们的例子中,对于用户控件,我们创建了单独的虚拟机,并且它的一个实例存在于ParentVM
。 因此,父视图将具有此控件,并将UserControlVM
绑定到此控件( ParentVM.UserControlVM
),并且usercontrol将处理其他绑定。
情况2:如果您的控件将被其他应用程序/开发人员使用,并且您不想保持简单,那么继续在控件模板实现之后创建自定义控件。 通过这种方式,您可以创建无需查看的控件并使用dependency properties
。 而且,使用该控件的人不需要了解相关的视图模型并使用它。
一些类似的问题/帖子:
WPF设计问题(自定义控件或mvvm):WPF设计问题(自定义控件或mvvm)
使用MVVM概念的WPF中的自定义控件:http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6293b176-e1e9-4610-af49-d53e6d294969/
带有MVVM和依赖属性的WPF用户控件地狱:带有MVVM和依赖属性的WPF用户控件地狱
UserControl
是“MVVM”中“View”的一部分,就像TextBox
或ListView
控件是View的一部分。
无论您决定使用MVVM开发您的UserControl
本身还是将其写入QBASIC(不推荐),它都不会为UserControl
的使用者破坏MVVM模式,只要他们可以通过绑定到DependencyProperty
来完成他们在UserControl
需要的所有事情暴露在你的UserControl
。 即你的UserControl
应该公开它所依赖的属性(因此名称)。 一旦你掌握了这个DependencyProperty
的突然意义,你希望他们对你在构造函数中指定的改变的事件处理器和默认值有帮助。
如果你的UserControl
在不同的程序集中,我看不出有什么不同。
也就是说,许多人会主张使用MVVM模式本身来构建您的UserControl
,这是MVVM带来的所有好处,例如帮助其他开发人员查看您的代码。 然而,有些事情根本不可能和/或更难以更复杂和性能更低的黑客XAML做到这一点 - 我不是在谈论你的花园品种添加用户窗体,但例如一个UserControl
处理数千视觉效果的布局。 此外,由于您在View中工作,因此您不希望UserControl
的ViewModel混入您的应用程序中!
基本上我说MVVM在MVVM中不会在你的View上使用MVVM!
基本上,不是将UserControl的datacontext绑定到userControlViewModel,而是最好在用户控件的第一个子元素上执行它。 这样,您在控件中所做的所有引用都将绑定到userControlViewModel,但可以根据您要使用UserControl的数据上下文集来设置依赖项属性。
对于我来说,这种模式对您的UserControl XAML非常有用:
<UserControl x:Class="Six_Barca_Main_Interface.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Six_Barca_Main_Interface"
xmlns:System="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
d:DesignHeight="900" d:DesignWidth="900">
<DockPanel x:Name="rootDock" >
<TextBlock>{Binding SomethingInMyUserControlViewModel}</TabControl>
</DockPanel>
</UserControl>
然后在后面的代码中:
public partial class MyUserControl : UserControl
{
UserControlViewModel _vm;
public MyUserControl()
{
InitializeComponent();
//internal viewModel set to the first child of MyUserControl
rootDock.DataContext = new UserControlViewModel();
_vm = (UserControlViewModel)rootDock.DataContext;
//sets control to be able to use the viewmodel elements
}
#region Dependency properties
public string textSetFromApplication
{
get{return (string)GetValue(textSetFromApplicationProperty);}
set{SetValue(textSetFromApplicationProperty, value);}
}
public static readonly DependencyProperty textSetFromApplicationProperty = DependencyProperty.Register("textSetFromApplication", typeof(string), typeof(MyUserControl), new PropertyMetadata(null, OnDependencyPropertyChanged));
private static void OnDependencyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyUserControl)d)._vm.SomethingInMyUserControlViewModel =
e.NewValue as string;
}
#endregion
链接地址: http://www.djcxy.com/p/56215.html