鉴于我有这个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中的每个属性,我也感到不舒服。有更好的方法吗?
我想这样做的原因是因为单元测试(即使没有InitializeComponent,创建UserControl也需要很长时间)
答案 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,而有时我只是直接将数据绑定到父视图模型。这一切都取决于你想对数据做什么。