【问题标题】:Custom control, View Model and dependency properties自定义控件、视图模型和依赖属性
【发布时间】:2011-12-21 13:41:03
【问题描述】:

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

他们留在控制班吗?如何将它们链接到 VM?

【问题讨论】:

    标签: silverlight xaml mvvm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      在 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}" />
      

      【讨论】:

      • 这是你如何使用用户控件,而不是自定义控件
      • @Xin:据我所知,我确实使用过没有模板绑定方法的自定义控件,而是直接在 View.Xaml 中指定绑定,例如&lt;MyCustomControl ItemsSource="{...}" MyCustomControl.CustomProperty="..." / &gt;,所以这应该不是问题
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 2012-08-29
        • 2010-12-16
        相关资源
        最近更新 更多