自定义控件,视图模型和依赖项属性

时间:2011-11-03 21:23:00

标签: silverlight xaml mvvm

我正在创建自定义控件,因为我需要在样式/模板中进行大量绑定,因此使用MVVM非常有意义。那么我在哪里声明依赖属性?

他们是否留在对照班?如何将它们链接到VM?

3 个答案:

答案 0 :(得分:4)

有关自定义控件和视图模型,请参阅my answer to your other question。这是简短版本:

  1. 自定义控件不应包含视图模型。
  2. 不要设置自己控件的数据上下文。这是为消费者保留的。
  3. 所有依赖属性都应在MyCustomControl.cs文件中声明。
  4. 在genric.xaml中使用TemplateBinding,因为它比Binding更有效。 / LI>

换句话说,边框或按钮的视图模型是什么?答:他们没有,因为他们只是控制。 UserControls具有视图模型,但控件只是呈现并与您提供的数据交互(在UserControl中的位置?)。对于经验丰富的MVVM开发人员来说,自定义控件开发可能是最困难的事情:你的反射是创建一个视图模型,但不幸的是,这种反射是错误的。我知道,因为我自己犯了这个错误。

答案 1 :(得分:1)

依赖属性可以在它们所属的控件中声明。

在WPF / Silverlight中跟踪MVVM时,常见的方法是将ViewModel设置为相应View的DataContext。因此,您可以使用XAML中的Bindings将自定义依赖项属性链接到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}" />

答案 2 :(得分:0)

创建自定义控件时,控件本身就是一个视图模型。在其上声明依赖项属性以公开自定义控件的用户可以利用的绑定。例如,如果您有时间轴控件,则可能将控件上的StartDate和EndDate等属性公开为依赖项属性。您的控件默认模板将对依赖项属性进行模板绑定。然后,您的控件的使用者可能具有项目时间轴视图模型,该视图模型将绑定到控件上的属性。

自定义控件的主要目的是为该行为提供易于覆盖的行为和默认外观(通过提供新模板)。希望这会有所帮助。