【问题标题】:WPF: Share an observable collection between two windows?WPF:在两个窗口之间共享一个可观察的集合?
【发布时间】:2012-10-20 08:38:16
【问题描述】:

我想知道如何在同一个项目中的两个不同 WPF 窗口之间共享 observablecollection。这种情况似乎很简单,但我还没有找到解决办法。

我有一个 Window1,它有一个绑定到 obervablecollection 的数据网格,如下所示:

        public Window1()
    {
        InitializeComponent();
        _bookLibrary = new ObservableCollection<BOOK>();       
        datagrid.ItemsSource = _bookLibrary;
    }

在 Window1 中,我可以在 _bookLibrary 集合中添加/删除 BOOK 对象,并且数据网格会正确更新。

我有另一个窗口,Window2。 Window2 使用服务引用,该服务引用也能够生成 BOOK 对象。我希望能够将 Window2 BOOK 对象添加到位于 Window1 中的 _bookLibrary 集合中(因为 Window1 具有显示整个库的“主”数据网格)。

我可能正在考虑为 Window2 BOOK 对象使用单独的集合,然后将该集合与 Window1 集合合并。

任何想法/建议将不胜感激。谢谢

【问题讨论】:

    标签: c# wpf xaml wpfdatagrid


    【解决方案1】:

    为了对我来说,您必须在您的架构中引入一个模型并在两个视图之间共享该模型。因此,您只需在 xaml 中将两个视图绑定到模型的相同属性(集合)。

    【讨论】:

      【解决方案2】:

      使用CollectionViewSource 似乎还有另一种非 MVVM 方式:

      <CollectionViewSource 
      Source="{Binding Source={x:Static Application.Current}, Path=_BookLibrary}"   
      x:Key="Window1View" />
      
      <CollectionViewSource 
      Source="{Binding Source={x:Static Application.Current}, Path=_BookLibrary}"
      x:Key="Window2View" />
      

      创建任何你想要的ItemsContainer(如ListBox)并引用适当的集合视图:

      <Window name="Window1">
      
      <ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8"
      ItemsSource="{Binding Source={StaticResource Window1View}}">
      

      ...

      </ListBox>
      </Window>
      

      对 Window2 执行相同操作。

      【讨论】:

      • 抱歉,我刚刚意识到我在第二个窗口中引用了一个私有对象“_NameLibrary”。另一个简单的解决方案是只创建一个对整个应用程序公开的类库,然后继续创建 2 个唯一的集合视图
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      相关资源
      最近更新 更多