依赖属性+ UserControl + ViewModel

时间:2015-01-21 12:08:25

标签: c# wpf mvvm data-binding user-controls

鉴于我有这个UserControl:

public class MyStringUserControl : UserControl
{
    public string MyString
    {
        get { return (string)GetValue(MyStringProperty); }
        set { SetValue(MyStringProperty, value); }
    }

    public static readonly DependencyProperty MyStringProperty =
        DependencyProperty.Register("MyString", typeof(string), typeof(MyStringUserControl),
            new FrameworkPropertyMetadata(null));
}

这个ViewModel:

public class MyStringViewModel
{
    public string MyString { get; set; }
}

现在我在另一个View中使用MyStringUserControl:

<controls:MyStringUserControl MyString="{Binding SomeStringProperty} />

我正在寻找一种优雅的方式将此字符串绑定回MyStringViewModel。
对于我必须复制后面的UserControl代码和ViewModel中的每个属性,我也感到不舒服。有更好的方法吗?

编辑#1:

我想这样做的原因是因为单元测试(即使没有InitializeComponent,创建UserControl也需要很长时间)

2 个答案:

答案 0 :(得分:0)

如果我打算这样做,我会使用DependencyProperty的PropertyChanged事件处理程序来设置我的ViewModel属性,并使用我的ViewModel的PropertyChanged事件处理程序来设置我的DependencyProperty。说过,我从来没有理由走这条特定的道路。

private SomeViewModel _viewModel;

public static readonly DependencyProperty MyStringProperty = DependencyProperty.Register("MyString", typeof(string), typeof(MyStringUserControl), new PropertyMetadata(OnMyStringChanged));

public MyStringUserControl()
{
    InitializeComponent();

    _viewModel = new SomeViewModel();
    _viewModel.PropertyChanged += OnViewModelPropertyChanged;

    this.DataContext = _viewModel;
}

private static void OnMyStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((MyStringUserControl)d).OnMyStringChanged(e.NewValue);
}

private void OnMyStringChanged(string newValue)
{
    _viewModel.SomeProperty = newValue;
}

private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "SomeProperty":
            SetValue(MyStringProperty, _viewModel.SomeProperty);
            break;
        default:
            break;
    }
}

答案 1 :(得分:0)

复制你的属性绝对没有意义。使用MVVM 意味着您需要为每个UserControl建立一个视图模型。当我使用UserControl作为视图的部分时,我很少使用单独的视图模型。有时候,我只会在后面的DependencyProperty代码中使用UserControl s,而有时我只是直接将数据绑定到父视图模型。这一切都取决于你想对数据做什么。