将一个控件放置在不同视图中时将其绑定到第二个控件的属性

时间:2011-05-30 13:58:28

标签: mvvm binding controls mvvm-light

我正在寻找一种合适的方式来绑定控件。 假设我有两个不同的观点。每个视图都有一个控件,我想将它们绑定在一起。第一个控件具有依赖项属性,并期望第二个控件将分配给该属性。
如果我正确理解MVVM的想法,我不希望在我的viewmodel中只有数据那些控件。所以我试图找到一种将控件从一个视图传递到另一个视图的正确方法。
在View的代码中依赖属性来绑定控件?那是正确的方法吗?虽然看起来不是很干净。考虑到视图的数据上下文是viewmodel而不是后面的代码这一事实,我将被迫在代码中将这些控件绑定在一起而不是声明方式。
也许我在这里错过了一些简单的东西。任何建议表示赞赏。

<小时/> 澄清:
情况如下:2个不同的视图和2个不同的控件。每个控件都位于单独的视图中。 ControlA具有ControlB类型的依赖项属性。所以我需要做一些类似于元素绑定的事情,但问题是我在同一个视图中没有这两个元素。

3 个答案:

答案 0 :(得分:0)

我不太确定“绑在一起”是什么意思,但也许你正在寻找这样的东西?

<local:UserControlB x:Name="UserControlB" />
<local:UserControlA local:UserControlA.SubControlB="{Binding ElementName=UserControlB}" />

为什么要在视图之间传递控件呢?通常你传递Data或DataContext

答案 1 :(得分:0)

您的意思是说您有两个视图,每个视图都有一个UserControlFoo,您希望这两个UserControlFoo实例链接到相同的数据吗?就像在两个视图上有一个滑块绑定到相同的数据,当一个滑块移动时,另一个移动也会反映变化?

如果是这种情况,只需将两个视图绑定到同一个ViewModel实例,确保在值更改时引发OnPropertyChanged并将绑定“UpdateSourceTrigger设置为PropertyChanged

这是一个包含两个(或更多)视图的示例,其中滑块使用与DataContext相同的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/en-us/magazine/dd419663.aspx

答案 2 :(得分:0)

通常,您将使用mediator pattern启用视图内通信,而不是通过依赖项属性启用。这允许您彼此独立地开发视图和控件,因为调解器将在视图之间提供松散耦合。

假设您有2个视图,其中视图A包含控件A,视图B包含控件B.您还有每个视图的视图模型。视图模型是使用共享介体进行视图之间的通信的地方。或者,您可以将介体作为依赖项属性添加到每个控件,并将该属性绑定到视图模型的介体。

查看A

  • 包含Control A
  • 将其DataContext设置为ViewModel A
  • 用户与Control A的交互使用数据绑定获取/设置视图模型属性
  • 查看模型包含对mediator / messenger的共享引用

查看B

  • 包含Control B
  • 将其DataContext设置为ViewModel B
  • 与Control B的用户交互使用数据绑定获取/设置视图模型属性
  • 查看模型包含对mediator / messenger的共享引用

因此,当用户在视图A上与控件A交互时,交互会使介体发布包含有关该事件的信息的消息。订阅视图B的视图模型,以便在发布此消息时得到通知,并更新其属性,从而通过数据绑定触发控件B的更改。

两个视图模型使用的介体是同一个实例,通常使用IoC容器注入视图模型。实现一个中介是相当简单的,并且还有一些MVVM工具包,比如MVVM Light,提供了一个“Messenger”类,可以实现这种通信。

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

Mediator和MVVM资源:

  1. Simple Mediator
  2. MVVM Light Toolkit
  3. Implementing the MVVM Pattern
  4. Event Aggregation