Атрибут Catel ViewToViewModel

Большое вам спасибо за вашу помощь.

Я пытаюсь понять атрибут ViewToViewModel, запустив небольшой пример. У меня есть пара вопросов. Мой код ниже.

  1. Должен ли атрибут [ViewToViewModel] размещаться в View, ViewModel или в обоих?

  2. Если я попытаюсь использовать атрибут MappingType, например: [ViewToViewModel, MappingType = ...] MappingType, выдает ошибку. Мне не хватает инструкции «использование»/ссылки на сборку? Есть пример синтаксиса?

  3. Я могу заставить все работать так, как мне нужно, но я не думаю, что часть «ViewToViewModel» работает правильно. В коде пользовательского элемента управления изменения свойств обрабатываются в HandleMyName (объект e). Должен ли ViewToViewModel делать это?

Взгляды:

  • Главное окно
  • UserControlView

ViewModels:

  • Главное окноВьюМодель
  • Усерконтролвиеввиевмодель

Главное окно

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

    }
}

}


person Johnny Beatniks    schedule 06.07.2013    source источник


Ответы (1)


1) ViewToViewModel должен быть расположен в представлении (вы не хотите загрязнять им свою виртуальную машину).

2) Атрибут следует использовать как [ViewToViewModel(MappingType = ...)]

3) ViewToViewModel должен обрабатывать автоматическое сопоставление свойства x в представлении со свойством x в модели представления. Он будет обрабатывать все уведомления об изменениях автоматически.

person Geert van Horrik    schedule 06.07.2013
comment
Я не могу заставить его автоматически обрабатывать уведомления об изменениях. Нужно ли что-то добавить в app.xaml.cs? Или что-то еще, что, по вашему мнению, нужно добавить? Идеи? - person Johnny Beatniks; 06.07.2013
comment
Ты прав. Я протестировал его, и кажется, что в версии WPF есть ошибка с сопоставлениями ViewToViewModel. Мы рассмотрим это. Я создал задачу, см. catelproject.atlassian.net/browse/CTL-112 - person Geert van Horrik; 07.07.2013
comment
Спасибо. Начинаю разбираться в этом! - person Johnny Beatniks; 08.07.2013
comment
Ошибка исправлена, и новый ночной выпуск был опубликован через NuGet. См. dl.dropboxusercontent.com/u/8455721/StackOverflow/ для рабочий пример. - person Geert van Horrik; 08.07.2013