我有一个使用MVVM模式编写的C#和WPF的用户控件。
我想做的就是将绑定的ViewModel中的属性暴露给控件外部。我希望能够将其绑定,希望任何对该属性做出的更改都能被绑定到该值的任何控件外部所捕获。
这听起来很简单,但它让我抓狂了(我的头发已经不多了)。
我在用户控件中有一个依赖属性。ViewModel拥有实现INotifyPropertyChanged接口的属性,并正确调用PropertyChanged事件。
一些问题:
1)如何在不破坏MVVM分离的情况下捕获对ViewModel属性的更改并将其与DependencyProperty关联起来?到目前为止,我唯一成功的方法是在控件的代码后台中分配ViewModel的PropertyChanged事件,这绝对不是MVVM。
2)使用上述方法,我可以让Dependency属性启动其PropertyChangedCallback,但在控件外部绑定到它的任何内容都无法捕获更改。
必须有一种简单的方法来完成所有这些。请注意,我没有在此处发布任何代码 - 我希望不要用我的现有代码影响答案。此外,你们可能会嘲笑它...
Rob
好的,为了澄清,以下是代码示例:
用户控件的代码后台:
我想做的就是将绑定的ViewModel中的属性暴露给控件外部。我希望能够将其绑定,希望任何对该属性做出的更改都能被绑定到该值的任何控件外部所捕获。
这听起来很简单,但它让我抓狂了(我的头发已经不多了)。
我在用户控件中有一个依赖属性。ViewModel拥有实现INotifyPropertyChanged接口的属性,并正确调用PropertyChanged事件。
一些问题:
1)如何在不破坏MVVM分离的情况下捕获对ViewModel属性的更改并将其与DependencyProperty关联起来?到目前为止,我唯一成功的方法是在控件的代码后台中分配ViewModel的PropertyChanged事件,这绝对不是MVVM。
2)使用上述方法,我可以让Dependency属性启动其PropertyChangedCallback,但在控件外部绑定到它的任何内容都无法捕获更改。
必须有一种简单的方法来完成所有这些。请注意,我没有在此处发布任何代码 - 我希望不要用我的现有代码影响答案。此外,你们可能会嘲笑它...
Rob
好的,为了澄清,以下是代码示例:
用户控件的代码后台:
public static DependencyProperty NewRepositoryRunProperty = DependencyProperty.Register("NewRepositoryRun", typeof(int?), typeof(GroupTree),
new FrameworkPropertyMetadata( null, new PropertyChangedCallback(OnNewRepositoryRunChanged)));
public int? NewRepositoryRun
{
get { return (int?)GetValue(NewRepositoryRunProperty); }
set
{
SetValue(NewRepositoryRunProperty, value);
}
}
private static void OnNewRepositoryRunChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (e.OldValue != e.NewValue)
{
}
}
public GroupTree()
{
InitializeComponent();
GroupTreeVM vm = new GroupTreeVM();
this.DataContext = vm;
}
视图模型(GroupTreeVM.cs)
private int? _NewRepositoryRun;
public int? NewRepositoryRun
{
get
{
return _NewRepositoryRun;
}
set
{
_NewRepositoryRun = value;
NotifyPropertyChanged();
}
}
(this.Content as FrameworkElement).DataContext = this
是你能做的最愚蠢的事情之一。只需使用Binding.ElementName
引用在根上定义的属性即可。 - user1228