WPF: Поделиться наблюдаемой коллекцией между двумя окнами? - PullRequest
1 голос
/ 20 апреля 2011

Мне было интересно, как я смогу поделиться наблюдаемой коллекцией между двумя разными окнами WPF в одном проекте. Ситуация кажется достаточно легкой, но я пока не нашел решения.

У меня есть Window1, у которого есть сетка данных, которая привязана к obervablecollection как:

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

В Window1 я могу добавлять / удалять объекты BOOK в коллекцию _bookLibrary и корректно обновлять сетку данных.

У меня есть другое окно, Window2. Window2 использует Service Reference, которая также может генерировать объекты BOOK. Я хочу иметь возможность добавлять объекты Window2 BOOK в коллекцию _bookLibrary, расположенную в Window1 (поскольку Window1 имеет "основную" сетку данных, в которой отображается вся библиотека).

Возможно, я думал об использовании отдельной коллекции для объектов Window2 BOOK, а затем объединить эту коллекцию с коллекцией Window1.

Любые идеи / предложения будут с благодарностью. Спасибо

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Для того, чтобы вы мне представили модель в своей архитектуре и поделились этой моделью между двумя представлениями. Таким образом, вы просто связываете в xaml оба вида с одним и тем же свойством (коллекцией) вашей модели.

0 голосов
/ 04 мая 2012

Похоже, существует другой не MVVM способ сделать это с помощью CollectionViewSource:

<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.

...