如何解决当一个控件放置在不同视图中时,将一个控件绑定到第二个控件的属性
| 我正在寻找将控件绑定在一起的正确方法。 假设我有两种不同的观点。每个视图都有一个控件,我想将它们绑定在一起。第一个控件具有依赖项属性,并期望将第二个控件分配给该属性。 如果我正确理解了MVVM的概念,那么我就不想在视图模型中拥有这些控件,而只是数据中。因此,我试图找到一种将控件从一个视图传递到另一个视图的正确方法。 在视图的代码后面有依赖项属性来绑定控件?那是正确的方法吗?看起来不是很干净。考虑到视图的数据上下文将是viewmodel而不是背后的代码这一事实,我将被迫以代码而非声明方式将这些控件绑定在一起。 也许我在这里缺少一些简单的东西。任何建议表示赞赏。 澄清: 情况如下:2个不同的视图和2个不同的控件。每个控件位于单独的视图上。 ControlA具有类型ControlB的依赖项属性。因此,我需要执行类似于元素绑定的操作,但是问题是我在同一视图中没有两个元素。解决方法
我不确定自己“绑定”是什么意思,但也许您正在寻找类似的东西?
<local:UserControlB x:Name=\"UserControlB\" />
<local:UserControlA local:UserControlA.SubControlB=\"{Binding ElementName=UserControlB}\" />
无论如何,为什么要在视图之间传递控件?通常,您传递数据或DataContext
, 您是说您有两个视图,每个视图都有一个“ 1”,并且您希望这两个“ 1”实例链接到相同的数据吗?就像在两个视图上都将一个滑块绑定到同一数据一样,当一个滑块移动时,另一个滑块也移动以反映更改吗?
如果是这种情况,只需将两个View绑定到相同的ViewModel实例,请确保在值更改时加3,并将绑定的4设置为5。
这是一个示例,该示例具有两个(或多个)带滑块的视图,并使用与View6Model相同的ViewModel:
在ViewModel中:
private double _sliderValue;
public double SliderValue
{
get { return _sliderValue; }
set
{
if (_sliderValue != value)
{
_sliderValue = value;
OnPropertyChanged(\"SliderValue\");
}
}
}
在视图中:
<Slider Value=\"{Binding Path=SliderValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}\"/>
然后两个视图都具有与DataContext相同的ViewModel
这是否回答你的问题?
如果您不熟悉OnPropertyChanged,请查看Josh Smith的文章:http://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx
, 通常,您将使用调解器模式而不是通过依赖项属性来启用视图内通信。这样一来,您就可以彼此独立地开发视图和控件,因为调解员将在视图之间提供松散的耦合。
假设您有2个视图,其中视图A包含控件A,视图B包含控件B。您还具有每个视图的视图模型。视图模型是通过使用共享介体在视图之间进行通信的地方。或者,您可以将介体作为依赖项属性添加到每个控件,并将该属性绑定到视图模型的介体。
查看A
包含控件A
将其DataContext设置为ViewModel A
用户与控件A的交互使用数据绑定获取/设置视图模型属性
视图模型包含对调解器/信使的共享引用
查看B
包含控件B
将其DataContext设置为ViewModel B
用户与控件B的交互使用数据绑定获取/设置视图模型属性
视图模型包含对调解器/信使的共享引用
因此,当用户在视图A上与控件A进行交互时,该交互会导致中介程序发布一条消息,其中包含有关事件的信息。视图B的视图模型被订阅,以便在此消息发布时得到通知,并更新其属性,从而通过数据绑定触发控件B的更改。
两个视图模型使用的介体是同一实例,通常使用IoC容器注入到视图模型中。实施中介程序非常简单,而且还有MVVM Light等多种MVVM工具箱,它们提供了支持此类通信的“ Messenger”类。
关键思想是您的视图和控件不再相互了解,而是将交互抽象为消息的发布和订阅。促进不同对象和对象类型之间的松耦合通信。
介体和MVVM资源:
简单调解员
MVVM Light工具包
实施MVVM模式
事件汇总
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。