将控件绑定到两个属性
Bind Control to Two properties
使用 MVVM 模式和 WPF,我想将我的控件绑定到两个属性。假设我有一个绑定到 VM1 上的 属性 的标签,我想将它也绑定到 VM2 上的 属性 以将收到的值从 VM1 发送到 VM2。
我可以使用 Messenger 和多个项目元组 Class,但我想知道是否有其他解决方案。多重绑定?但是我需要 ValueConverter。
感谢您的任何建议。
如果连接了 2 个属性,通常可以利用 INotifyPropertyChanged 来通知同一 ViewModel 上 2 个或更多属性的更改。
据我了解,您还想通知附加到 ViewModel 的视图关于另一个 ViewModel 上 属性 的更改。这通常是通过让 ViewModel 交换信息来完成的。
如果这是一种罕见的情况,那么使用消息总线可能有点矫枉过正。通常保留对每个视图模型的引用并从外部更改属性应该没问题。为了保持关注点分离,您可以在一个或两个视图模型上创建一个接口,并引用该接口而不是具体类型。
总的来说,在控件和 属性 之间保持单一绑定使其简单易懂,您应该担心确保此 属性 处理所有更改 to/from 其他 VM .
由于 View-Model 是公开 public 属性和命令的视图的抽象,因此视图没有多大意义按照您解释的方式有两个视图模型。如果有一个 VM
class 作为视图的视图模型,它会更合理,它具有类型 VM1
和 VM2
的两个属性。然后绑定将在 VM.VM1.YourText
上,您可以通过这样的事件通知 VM2
:
在 VM1 中:
public event EventHandler<EventArgs> ValueChanged;
string _yourText;
public string YourText
{
get
{
return _yourText;
}
set
{
_yourText= value;
if (ValueChanged != null)
ValueChanged(_yourText, new EventArgs());
}
}
虚拟机中:
public VM1 Vm1 {get; set;}
public VM2 Vm2 {get; set;}
public VM()
{
InitializeComponent();
Vm1 = new VM1();
Vm2 = new VM2();
Vm1.ValueChanged += Item_ValueChanged;
DataContext = this;
}
void Item_ValueChanged(object sender, EventArgs e)
{
VM2.YourAnotherText = sender.ToString();
}
使用 MVVM 模式和 WPF,我想将我的控件绑定到两个属性。假设我有一个绑定到 VM1 上的 属性 的标签,我想将它也绑定到 VM2 上的 属性 以将收到的值从 VM1 发送到 VM2。
我可以使用 Messenger 和多个项目元组 Class,但我想知道是否有其他解决方案。多重绑定?但是我需要 ValueConverter。
感谢您的任何建议。
如果连接了 2 个属性,通常可以利用 INotifyPropertyChanged 来通知同一 ViewModel 上 2 个或更多属性的更改。
据我了解,您还想通知附加到 ViewModel 的视图关于另一个 ViewModel 上 属性 的更改。这通常是通过让 ViewModel 交换信息来完成的。
如果这是一种罕见的情况,那么使用消息总线可能有点矫枉过正。通常保留对每个视图模型的引用并从外部更改属性应该没问题。为了保持关注点分离,您可以在一个或两个视图模型上创建一个接口,并引用该接口而不是具体类型。
总的来说,在控件和 属性 之间保持单一绑定使其简单易懂,您应该担心确保此 属性 处理所有更改 to/from 其他 VM .
由于 View-Model 是公开 public 属性和命令的视图的抽象,因此视图没有多大意义按照您解释的方式有两个视图模型。如果有一个 VM
class 作为视图的视图模型,它会更合理,它具有类型 VM1
和 VM2
的两个属性。然后绑定将在 VM.VM1.YourText
上,您可以通过这样的事件通知 VM2
:
在 VM1 中:
public event EventHandler<EventArgs> ValueChanged;
string _yourText;
public string YourText
{
get
{
return _yourText;
}
set
{
_yourText= value;
if (ValueChanged != null)
ValueChanged(_yourText, new EventArgs());
}
}
虚拟机中:
public VM1 Vm1 {get; set;}
public VM2 Vm2 {get; set;}
public VM()
{
InitializeComponent();
Vm1 = new VM1();
Vm2 = new VM2();
Vm1.ValueChanged += Item_ValueChanged;
DataContext = this;
}
void Item_ValueChanged(object sender, EventArgs e)
{
VM2.YourAnotherText = sender.ToString();
}