2013-07-06 67 views
0

非常感謝您的幫助。Catel ViewToViewModel屬性

我想通過一個小例子來理解ViewToViewModel屬性的工作。我有幾個問題。我的代碼如下。

  1. [ViewToViewModel]屬性應該放置在View,ViewModel還是兩者?

  2. 如果我嘗試使用屬性,MappingType,如:[ViewToViewModel,MappingType = ...] MappingType給我一個錯誤。我是否缺少「使用」語句/程序集參考?有沒有語法的例子?

  3. 我能夠讓事情按我需要的方式工作,但我不認爲我得到「ViewToViewModel」部分才能正常工作。在用戶控件的代碼隱藏中,屬性更改在HandleMyName(對象e)中處理。 ViewToViewModel是否應該這樣做?

瀏覽:

  • 主窗口
  • UserControlView

的ViewModels:

  • MainwindowViewModel
  • 用戶控件ViewViewmodel

主窗口

<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() 
    { 

    } 
} 

}

回答

0

1)ViewToViewModel應該位於視圖中(你不想用它污染你的虛擬機)。

2)屬性應作爲[ViewToViewModel(MappingType = ...)]

3)ViewToViewModel應該處理的視圖屬性x上視圖模型屬性x的自動映射。它將自動處理所有更改通知。

+0

我無法自動處理更改通知。有什麼需要添加到app.xaml.cs?或者其他你能想到的東西需要添加嗎?想法? –

+0

你說得對。我測試了它,似乎WPF版本中有一個ViewToViewModel映射的錯誤。我們會研究這一點。我創建了一個問題,請參閱https://catelproject.atlassian.net/browse/CTL-112 –

+0

謝謝。開始得到這個竅門! –