在WPF ViewModel和UserControl之间共享非控件相关的数据
本文关键字:控件 数据 共享 ViewModel WPF UserControl 之间 | 更新日期: 2023-09-27 18:07:10
我是WPF和MVVM模式的新手,所以请记住这一点。
我负责的项目有一个视图和一个视图模型。视图还包含一个没有视图模型的用户控件。有数据(自定义对象…Order)被传递给我还需要与用户控件共享的视图模型。
看起来UserControl确实通过DependencyPropertys
在视图模型之间共享数据,但这些数据只是用户控件上的文本框,看起来要绑定回视图模型上的属性。
我需要在用户控件上共享不会由控件表示的数据。是否有一个好的方法来传递这个数据(复杂的订单对象)?也许我确实需要在用户控件上隐藏一些控件来完成这个,但我不太确定,因为我是新手。如有任何建议,不胜感激。
不需要隐藏字段(或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的依赖属性,ViewModelOrder是视图模型中属性的名称,您需要将local:MyUserControl替换为您的控件名称/命名空间
你可以简单地在UserControl的类中创建一个依赖属性,并在使用该控件的视图中绑定到它。不需要在内部将依赖属性绑定到UserControl中的某个控件。