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

  • 包含控件B
  • 将其DataContext设置为ViewModel B
  • 用户与控件B的交互使用数据绑定获取/设置视图模型属性
  • 视图模型包含对中介器/信使的共享引用
因此,当用户与视图a上的控件a交互时,该交互会导致中介发布包含事件信息的消息。视图B的视图模型将在发布此消息时收到通知,并更新其属性,这将通过数据绑定触发控件B中的更改

两个视图模型使用的中介是同一个实例,通常使用IoC容器注入到视图模型中。实现中介非常简单,还有一些MVVM工具包,如MVVM Light,它们提供了一个“Messenger”类来支持这种通信

关键的想法是,您的视图和控件不再相互了解,相反,交互被抽象为消息的发布和订阅;促进不同对象和对象类型之间的松散耦合通信

中介和MVVM资源:


  • 谢谢您的建议,但只有当控件处于同一视图时,它才会起作用。我真的不想像你说的那样传递控件,但我看不到其他方法可以做到这一点。我使用第三方控件,设计上controlA依赖于controlB。在我的例子中,它们被放在不同的视图中。@incognito在ControlA的Loaded事件中,您可以做一些事情,在可视化树中查找两个控件的父元素,然后向下查找ControlB。您能告诉我您的目标/任务是什么吗?不是技术细节。所以我可以更好地帮助你:)我想我没有解释清楚。情况如下:2个不同的视图和2个不同的控件。每个控件驻留在单独的视图中。ControlA具有ControlB类型的依赖项属性。所以我需要做一些类似于元素绑定的事情,但问题是我没有将两个元素都放在同一个视图中。我不知道有什么方法可以做到这一点,如果没有一些肮脏的代码和视图模型知道它们的视图等,对不起。我注意到你的评论“我使用第三方控件,按设计,控件a依赖于控件B。在我的情况下,它们被放在不同的视图中”。考虑到您对所使用的控件没有完全的控制权,您可能不得不放弃使用MVVM模式,并泄漏有关MVVM的知识