Catel ViewToViewModel属性

时间:2013-07-06 03:22:23

标签: wpf mvvm catel

非常感谢你的帮助。

我试图通过一个小例子来理解ViewToViewModel属性。我有几个问题。我的代码如下。

  1. 是否应将[ViewToViewModel]属性放置在View,ViewModel或两者中?

  2. 如果我尝试使用属性MappingType,例如:[ViewToViewModel,MappingType = ...] MappingType会给我一个错误。我错过了“使用”声明/汇编参考吗?是否有语法示例?

  3. 我能够以我需要的方式工作,但我认为我没有让“ViewToViewModel”部分正常工作。在usercontrol的代码隐藏中,属性更改在HandleMyName(对象e)中处理。 ViewToViewModel应该这样做吗?

  4. 查看:

    • 主窗口
    • UserControlView

    的ViewModels:

    • MainwindowViewModel
    • UserControlViewViewmodel

    主窗口

    <catel:DataWindow x:Class="ViewToViewModelStudy.Views.MainWindow"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  xmlns:catel="http://catel.codeplex.com"
                  xmlns:uc="clr-namespace:ViewToViewModelStudy.Views" >
      <StackPanel x:Name="LayoutRoot">
        <Label Content="{Binding Title}" />
        <uc:UserControlView MyName="{Binding Title}"  />
      </StackPanel>
    </catel:DataWindow>
    

    UserControlView.xaml

    <catel:UserControl x:Class="ViewToViewModelStudy.Views.UserControlView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:catel="http://catel.codeplex.com">
      <StackPanel>
        <TextBlock>Innerview Model</TextBlock>
        <TextBlock Text="{Binding MyName}"></TextBlock>
        <TextBlock>Innerview Model</TextBlock>
      </StackPanel>
    </catel:UserControl>
    

    UserControlView.xaml.cs

    namespace ViewToViewModelStudy.Views
    {
       using Catel.Windows.Controls;
       using Catel.MVVM.Views;
       using System.Windows;
       using System.Data;
    
    public partial class UserControlView : UserControl
    {
        [ViewToViewModel]
        public string MyName
        {
            get { return (string)GetValue(MyNameProperty); }
            set { SetValue(MyNameProperty, value); }
        }
    
        public static readonly DependencyProperty MyNameProperty =
           DependencyProperty.Register(
           "MyName",
           typeof(string),
           typeof(UserControlView),
         new FrameworkPropertyMetadata(null,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, new PropertyChangedCallback(OnMyName)));
    
        static void OnMyName(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            UserControlView ic = (UserControlView)obj;
            ic.HandleMyName(e.NewValue);
        }
    
        private void HandleMyName(object e)
        {
               ViewModels.UserControlViewModel vm = (ViewModels.UserControlViewModel)this.ViewModel;
    
               if (vm != null)
               {
                   vm.MyName = e.ToString();  // << Shouldn't this happen automagically?
               }
        }
    
        public UserControlView()
        {
            InitializeComponent();
        }
    
      }
    }
    

    UserControlViewModel.cs

    namespace ViewToViewModelStudy.ViewModels
    {
    
        using Catel.MVVM;
        using Catel.Data;
        using Catel.MVVM.Views;
        using Catel.Windows.Controls;
    
    public class UserControlViewModel : ViewModelBase
    {
        public UserControlViewModel()
        { }
    
        public string MyName
        {
            get { return GetValue<string>(MyNameProperty); }
            set { SetValue(MyNameProperty, value); }
        }
    
        public static readonly PropertyData MyNameProperty = RegisterProperty("MyName", typeof(string), null, (sender, e) => ((UserControlViewModel)sender).OnMyPropertyChanged());
    
        private void OnMyPropertyChanged()
        {
    
        }
    }
    

    }

1 个答案:

答案 0 :(得分:0)

1)ViewToViewModel应该位于视图中(您不希望用它污染您的VM)。

2)该属性应该用作[ViewToViewModel(MappingType = ...)]

3)ViewToViewModel应该处理视图上属性x的自动映射到视图模型上的属性x。它将自动处理所有更改通知。