首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Catel ViewToViewModel属性

Catel ViewToViewModel属性
EN

Stack Overflow用户
提问于 2013-07-06 03:22:23
回答 1查看 547关注 0票数 0

非常感谢你的帮助。

我试图通过使用一个小示例来理解ViewToViewModel属性。我问了几个问题。我的密码在下面。

  1. ViewToViewModel属性应该放置在视图、ViewModel中还是两者都放置?
  2. 如果我尝试使用一个属性,MappingType,例如: ViewToViewModel,MappingType =.MappingType给了我一个错误。我是否遗漏了“使用”语句/程序集引用?有语法的例子吗?
  3. 我能够让事情按照我需要的方式工作,但我认为我没有让"ViewToViewModel“部分正常工作。在用户控件的代码背后,属性更改是在HandleMyName(对象e)中处理的。ViewToViewModel应该这么做吗?

视图:

  • MainWindow
  • UserControlView

ViewModels:

  • MainwindowViewModel
  • UserControlViewViewmodel

MainWindow

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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()
    {

    }
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-06 12:37:29

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17499366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档