我是WPF和MVVM模式的新手,所以请记住这一点。
我负责工作的项目有一个视图和一个视图模型。该视图还包含一个没有视图模型的用户控件。有数据(自定义对象... Order)被传递给视图模型,我还需要与用户控件共享。
看起来UserControl确实已经通过DependencyPropertys
在视图模型之间共享数据,但是这个数据只是用户控件上的文本框,它们看起来被绑定到视图模型上的propertys。
我需要共享不会由用户控件上的控件表示的数据。是否有传递此数据的好方法(复杂的Order对象)?也许我确实需要对我的用户控件进行某种隐藏控制来实现这一目标,但我不确定是否对此不熟悉。任何建议将不胜感激。
答案 0 :(得分:1)
不需要隐藏字段(或WPF中的任何此类概念),因为您可以向用户控件添加任何自定义属性。
在用户控件中,创建一个新的依赖属性,但是设置了MyUserControl:
public Order CurrentOrder
{
get { return (Order)GetValue(CurrentOrderProperty); }
set { SetValue(CurrentOrderProperty, value); }
}
// Using a DependencyProperty as the backing store for CurrentOrder. This enables binding, etc.
public static readonly DependencyProperty CurrentOrderProperty =
DependencyProperty.Register("CurrentOrder", typeof(Order), typeof(MyUserControl), new PropertyMetadata(null, OnCurrentOrderPropertyChanged));
public static void OnCurrentOrderPropertyChanged(DependencyObject Sender, DependencyPropertyChangedEventArgs e)
{
var sender = Sender as MyUserControl;
var NewValue = e.NewValue as Order;
var OldValue = e.OldValue as Order;
if (OldValue != null && sender != null)
{
//Use old value as needed and use sender instead of this as method is static.
}
if (NewValue != null && sender != null)
{
//Use new value as needed and use sender instead of this as method is static.
}
}
在您使用usercontrol的父视图中,您可以编写如下内容:
<local:MyUserControl CurrentOrder="{Binding ViewModelOrder}" />
其中CurrentOrder是usercontrol的dependancy属性,ViewModelOrder是视图模型中属性的名称,您需要将local:MyUserControl替换为您的控件名称/命名空间。
答案 1 :(得分:1)
您可以在UserControl的类中创建依赖项属性,并在使用该控件的View中绑定它。无需在内部将依赖项属性绑定到UserControl中的一个控件。