【问题标题】:WPF : Multiple views, one DataContextWPF:多个视图,一个 DataContext
【发布时间】:2011-02-16 22:12:47
【问题描述】:

我正在开发一个必须处理多个屏幕(目前是两个)的 WPF 应用程序。

一个视图可以在多个屏幕上打开,并且用户操作必须一致地反映在所有屏幕上。

为了实现这一点,对于给定类型的视图,将实例化单个 DataContext。然后,当一个视图显示在屏幕上时,唯一的 DataContext 会附加到它上面。所以,一个 DataContext,几个视图(相同类型的视图/xaml)。

到目前为止一切顺利。它在大多数情况下都非常有效。

我确实对依赖于 ItemsControl 的特定视图有疑问。这些 ItemsControl 用于显示在 ViewModel/DataContext(C# 代码)中动态构建的 UIElement。这些 UIElement 大多是 Path 对象。示例:

<ItemsControl ItemsSource="{Binding WindVectors}">
   <ItemsControl.Template>
     <ControlTemplate TargetType="{x:Type ItemsControl}">
       <Canvas IsItemsHost="True" />
     </ControlTemplate>
   </ItemsControl.Template>
 </ItemsControl>

这里,WindVectorsObservableCollection&lt;UIElement&gt;

第一次打开视图时,一切都很好。问题是当视图在另一个屏幕上打开时,所有 ItemsControl 都会从第一个屏幕中删除,并在第二个屏幕上显示一个。此视图上的其他 WPF 组件(例如 TextBlock)反应正常并显示在两个屏幕上。

任何帮助将不胜感激。

谢谢。

面料

【问题讨论】:

    标签: wpf datacontext itemscontrol


    【解决方案1】:

    这是预期的行为(即自 winforms 以来一直如此)- 这是因为 ObservableCollection 是一个引用。这不会发生在值类型上,只有引用类型。

    简短的回答是“不要那样做”。您可以尝试在 xaml 中定义一个集合视图,或者编写一个自定义数据提供程序并绑定到其中之一。

    【讨论】:

    • 感谢您的回答。我认为不涉及引用或 ObservableCollection。我有其他图形组件绑定到参考对象的 ObservableCollections(例如通过 ListBox),它们显示在两个屏幕上。我认为这更多的是关于 ItemsControl 但我无法详细说明这一点:)
    • 列表框获取项目并生成 ListItems - 它不像 ItemsControl 那样直接使用集合中的项目。当您将 ItemsControl(或类似控件)绑定到集合时,目标控件将作为引用保存在该集合上 - 将同一集合绑定到另一个控件会将引用从当前控件移开,这将导致它丢失其数据。您要么必须克隆列表,要么查看 collectionview。
    猜你喜欢
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2013-03-08
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多