Mvvm 将一个控件绑定到第二个控件';将它们放置在不同视图中时的属性
我正在寻找一种将控件绑定在一起的正确方法。 假设我有两种不同的观点。每个视图都有一个控件,我想将它们绑定在一起。第一个控件有一个依赖项属性,并期望将第二个控件分配给该属性。Mvvm 将一个控件绑定到第二个控件';将它们放置在不同视图中时的属性,mvvm,binding,controls,mvvm-light,Mvvm,Binding,Controls,Mvvm Light,我正在寻找一种将控件绑定在一起的正确方法。 假设我有两种不同的观点。每个视图都有一个控件,我想将它们绑定在一起。第一个控件有一个依赖项属性,并期望将第二个控件分配给该属性。 如果我正确理解了MVVM的概念,我不想在我的viewmodel中包含这些控件,只想包含数据。因此,我试图找到一种正确的方法,将控件从一个视图传递到另一个视图。 视图代码中的依赖项属性来绑定控件?这样做正确吗?但看起来不是很干净。考虑到视图的数据上下文将是viewmodel而不是代码,我将被迫以代码而不是声明方式将这些控件
如果我正确理解了MVVM的概念,我不想在我的viewmodel中包含这些控件,只想包含数据。因此,我试图找到一种正确的方法,将控件从一个视图传递到另一个视图。
视图代码中的依赖项属性来绑定控件?这样做正确吗?但看起来不是很干净。考虑到视图的数据上下文将是viewmodel而不是代码,我将被迫以代码而不是声明方式将这些控件绑定在一起。
也许我错过了一些简单的东西。如有任何建议,我们将不胜感激。
澄清:
情况如下:2个不同的视图和2个不同的控件。每个控件驻留在单独的视图中。ControlA具有ControlB类型的依赖项属性。因此,我需要做一些类似于元素绑定的事情,但问题是我没有将两个元素都放在同一个视图中。我不太确定“绑定在一起”是什么意思,但也许您正在寻找类似的东西
<local:UserControlB x:Name="UserControlB" />
<local:UserControlA local:UserControlA.SubControlB="{Binding ElementName=UserControlB}" />
为什么要在视图之间传递控件?通常您传递数据或DataContext,您的意思是您有两个视图,每个视图都有一个
UserControlFoo
,并且希望这两个UserControlFoo
实例链接到相同的数据吗?就像两个视图上的滑块绑定到相同的数据,当一个滑块移动时,另一个滑块也会移动以反映更改
如果是这种情况,只需将两个视图绑定到同一个ViewModel实例,确保在值更改时引发OnPropertyChanged
,并将绑定'UpdateSourceRigger
设置为PropertyChanged
下面是一个示例,其中有两个(或多个)带有滑块的视图使用与DataContext
相同的视图模型:
在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的文章:通常您会使用而不是通过依赖项属性启用视图内通信。这允许您独立地开发视图和控件,因为中介将提供视图之间的松散耦合 假设您有两个视图,视图A包含控件A,视图B包含控件B。每个视图都有一个视图模型。视图模型是视图之间使用共享中介进行通信的地方。或者,您可以将中介作为依赖属性添加到每个控件中,并将该属性绑定到视图模型的中介 查看A
- 包含控件A
- 将其DataContext设置为ViewModel A
- 用户与控件的交互使用数据绑定获取/设置视图模型属性
- 视图模型包含对中介器/信使的共享引用
- 包含控件B
- 将其DataContext设置为ViewModel B
- 用户与控件B的交互使用数据绑定获取/设置视图模型属性
- 视图模型包含对中介器/信使的共享引用
谢谢您的建议,但只有当控件处于同一视图时,它才会起作用。我真的不想像你说的那样传递控件,但我看不到其他方法可以做到这一点。我使用第三方控件,设计上controlA依赖于controlB。在我的例子中,它们被放在不同的视图中。@incognito在ControlA的Loaded事件中,您可以做一些事情,在可视化树中查找两个控件的父元素,然后向下查找ControlB。您能告诉我您的目标/任务是什么吗?不是技术细节。所以我可以更好地帮助你:)我想我没有解释清楚。情况如下:2个不同的视图和2个不同的控件。每个控件驻留在单独的视图中。ControlA具有ControlB类型的依赖项属性。所以我需要做一些类似于元素绑定的事情,但问题是我没有将两个元素都放在同一个视图中。我不知道有什么方法可以做到这一点,如果没有一些肮脏的代码和视图模型知道它们的视图等,对不起。我注意到你的评论“我使用第三方控件,按设计,控件a依赖于控件B。在我的情况下,它们被放在不同的视图中”。考虑到您对所使用的控件没有完全的控制权,您可能不得不放弃使用MVVM模式,并泄漏有关MVVM的知识