将两个UserControl绑定到同一个DataContext或ViewModel?

3
我正在开发一个用户控件,它由一个图表面板和另一个区域组成,用于操纵一些图表数据,即图表控件(更改图形颜色,在图表上启用或禁用某些内容等)。
我使用ViewModel来管理图表及其数据,但是考虑到让图表控件区域独立出来,以避免我的xaml变得过多,并分离组件,这样也许更好。
然而,如果我这样做,由于控件需要操作Chart ViewModel中的数据,我应该如何处理呢?我可以将Chart控件的DataContext绑定到Chart的DataContext上,这样我就只有一个ViewModel吗?还是应该给我的图表控件单独设置一个ViewModel,然后让图表面板和图表控件的ViewModel进行交互?
或者只是忘记分离用户控件并将所有内容都放到一个大的ViewModel/xaml控件中?
在这种情况下,人们会推荐什么呢?
1个回答

3
你绝对可以让你的两个绑定到同一个。你可以将每个的绑定到相同的对象实例,或者你可以将一个控件的绑定到另一个控件的,并将其绑定到你的。
如果你已经有了一个工作正常的视图和视图模型实现,并且你觉得XAML变得难以管理,那么我认为你应该将XAML分成多个视图。这并不意味着你需要分离你的实现,直到你觉得它变得不连贯或者太大。现在分离它只会增加复杂性,因为你暗示它们仍然需要通信。
你可以考虑从图表控件区域简单地创建一个,并将该控件嵌入到你现有的控件中。然后你就不必修改使用你的图表控件的任何屏幕。

很棒,这肯定会为我简化事情。你能提供一个小例子或链接,展示如何将每个控件的DataContext绑定到同一个对象实例,或将一个控件的DataContext绑定到另一个控件的DataContext吗?两种方式都可以,但我还没有找到语法。谢谢! - Nicros
搞定了,似乎可以正常工作。 在子UserControl中: DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:SpectraView}}}" - Nicros
要小心相对源数据绑定,它可能在运行时非常昂贵!为什么不通过名称直接绑定到另一个元素呢? - Matt Casto
2
我想宣布我是个白痴。谢谢。不需要绑定DataContext,因为如果我只为整个事情创建一个ViewModel,所有子项都可以访问所需的属性。 - Nicros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接