在不同UserControl之间的View(而不是ViewModel)中共享属性

时间:2013-12-12 10:15:16

标签: wpf mvvm element-binding

我有一个显示类似于地理地图的视图,我在这个视图中有一些UserControls,每个显示有关DataContext的相关信息,但是每个都来自不同的视角,所以说

然后,我的目标是将鼠标悬停在一个UserControl上,突出显示每个UserControl中的一个功能,当然这个突出显示的视觉风格对每个UserControl都是特定的。

例如,如果我在地图中有一个路径,并且在图表中绘制了它的高程轮廓,我想将鼠标悬停在高程轮廓上,动态地在该图形上显示一条垂直线,同时一些标记将在地图中动态显示,反之亦然。

我可以通过在View本身中使用一些数值来实现,在每个UserControl中都是双向数据绑定,但是存在一些概念上的问题:

  • 经典数据绑定会在ViewModel中设置一个属性,但“鼠标突出显示”功能是特定于View(它不代表对象状态),我绝对不希望将这样的属性添加到ViewModel,会使用特定于View的代码污染它;
  • 创建UserControl时,其DataContext是ViewModel或其某些属性。需要将UserControl的一部分DataContext更改为另一个对象似乎不是一种明智或简单的方法;
  • 我可能会在视图中创建一个Slider并使用折叠可见性,并对每个UserControl使用ElementBinding,但是,如何在View和包含的UserControl之间进行ElementBinding?

所以,主要问题是:

  

如何将View中的单个属性(不在ViewModel!中)绑定到给定View中包含的许多UserControl?

如果一切都是单一的单片视图,使用ElementBinding对我来说是明显的选择,但是对于不同的类(一个View和许多UserControls),我不知道如何做ElementBinding,或者即使它是正确的做我想做的事。

1 个答案:

答案 0 :(得分:1)

我可能会错过您的问题,但为什么不简单地将依赖属性添加到View并将其绑定到包含的UserControls?

<YourView x:Name="yourView">
 <YourUserControl SomePropertyOfYourUserControl="{Binding ElementName=yourView, Path="YourView's DependencyProperty"/>
 <YourSecondUserControl SomePropertyOfYourSecondUserControl="{Binding ElementName=yourView, Path="YourView's DependencyProperty"/>
</YourView>

-

编辑以完成我的回答:

你说:

  

经典数据绑定会在ViewModel

中按下属性

..但它不一定必须这样做,因为你也可以绑定到View中的依赖属性(在其代码隐藏中)。