【发布时间】:2011-12-21 13:41:03
【问题描述】:
我正在创建自定义控件,因为我需要在样式/模板中进行大量绑定,所以使用 MVVM 非常有意义。那我在哪里声明依赖属性呢?
他们留在控制班吗?如何将它们链接到 VM?
【问题讨论】:
标签: silverlight xaml mvvm
我正在创建自定义控件,因为我需要在样式/模板中进行大量绑定,所以使用 MVVM 非常有意义。那我在哪里声明依赖属性呢?
他们留在控制班吗?如何将它们链接到 VM?
【问题讨论】:
标签: silverlight xaml mvvm
请参阅my answer to your other question,了解自定义控件和视图模型。这是简短的版本:
换句话说,Border 或 Button 的视图模型是什么?答:他们没有,因为他们只是控制。 UserControls 具有视图模型,但控件只是呈现并与您提供给它们的数据交互(在哪里?在您的 UserControl 中)。对于经验丰富的 MVVM 开发人员来说,自定义控件开发可能是最困难的事情:您的反应是制作视图模型,但不幸的是,这种反应是错误的。我知道,因为我自己也犯了这个错误。
【讨论】:
依赖属性可以在它们所属的控件中声明。
在 WPF/Silverlight 中跟随 MVVM 时,常用的方法是将 ViewModel 设置为相应 View 的 DataContext。因此,您可以使用 XAML 中的绑定将自定义依赖属性链接到 ViewModel 属性。
假设您已经将 ViewMosel 设置为 View 的 DataContext:
var view = new UserView
{
DataContext = new UserViewModel { Name = "Custom Name" }
};
public class UserViewModel
{
string Name { get; set; }
}
UserView.xaml:
<TextBlock Text="{Binding Name}" />
【讨论】:
<MyCustomControl ItemsSource="{...}" MyCustomControl.CustomProperty="..." / >,所以这应该不是问题
创建自定义控件时,控件本身就是一个视图模型。在其上声明依赖属性以公开自定义控件的用户可以利用的绑定。例如,如果您有一个时间线控件,您可能在控件上具有像 StartDate 和 EndDate 这样的属性,这些属性显示为依赖项属性。您的控件默认模板将使模板绑定到依赖项属性。然后,您的控件的使用者可能有一个项目时间线视图模型,他将其绑定到控件上的属性。
自定义控件的主要目的是为该行为提供易于覆盖的行为和默认外观(通过提供新模板)。希望这会有所帮助。
【讨论】: