Связывание свойств нескольких древовидных представлений с одним и тем же ViewModel - PullRequest
1 голос
/ 20 сентября 2011

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

каждое из представлений будет иметь похожее дерево с копией [почти] всех одинаковых элементов.

Я хотел бы синхронизировать свойство IsExpanded для всех представлений / TreeView ..

Это означает, что если я сверну один узел, я бы хотел, чтобы все они свернулись (а некоторые - ширины столбцов и т. Д.).

Один из способов сделать это - привязать все представления к одной и той же модели представления и иметь DependencyProperty для этой ViewModel и установить привязку как Two Way для каждого представления. Однако мне нужно, чтобы каждое представление было привязано к отдельной модели представления, чтобы оно могло отображать уникальные значения. Мне просто нужно синхронизировать несколько свойств дерева, таких как IsExpanded и Width.

Какой будет лучший подход здесь?

Ответы [ 4 ]

1 голос
/ 20 сентября 2011

Вы можете использовать сервис Prism и EventAggregator из него для обмена данными между моделями представления.

1 голос
/ 20 сентября 2011

Нет причин, по которым вы не можете иметь разные коллекции в одной ViewModel, если это лучший вариант дизайна. Особенно, если несколько деревьев / коллекций отфильтрованы из некоторого «полного набора»; это может на самом деле иметь больше смысла.

Просто добавьте несколько коллекций в вашу ViewModel и привяжите их.

public class MyViewModel : INotifyPropertyChanged
{
    public ObservableCollection<MyItem> FirstTreeCollection 
    { 
        get
        {
            // whatever you need to do here
        }
    }

    public ObservableCollection<MyItem> SecondTreeCollection 
    { 
        get { /* etc */ }
        set { /* etc */ }
    }
    // etc

    public bool Collapsed
    {
        get;
        set;
    }
}

и ваши просмотры должны связываться соответственно

// in your first view that contains a tree
<UserControl x:Class="View1" ...>
    <TreeView Name="FirstTree" 
              ItemsSource={Binding FirstTreeCollection}
              Collapsed={Binding Collapsed} ... >

// & in your second view that contains a tree
<UserControl x:Class="View2" ...>
    <TreeView Name="SecondTree" 
              ItemsSource={Binding SecondTreeCollection}
              Collapsed={Binding Collapsed} ... >

Чтобы уточнить, я предлагаю вам использовать одну ViewModel для всех этих древовидных представлений.

0 голосов
/ 20 сентября 2011

Если вы отображаете древовидную структуру с помощью xaml, вы можете привязать каждое древовидное представление к первому порожденному древовидному представлению.

Например, вы можете использовать такую ​​привязку, как эта:

<TreeView Name="FirstTreeView" />
<TreeView Name="SecondTree" 
          IsExpended = {Binding Path=IsExpanded, ElementName=FirstTreeView, Mode=TwoWay}/>
0 голосов
/ 20 сентября 2011

ViewModel не будет нуждаться в DependencyPropery - ему просто нужно будет предоставить свойство, которое реализует INotifyPropertyChanged.

Две модели ViewModel должны иметь какой-либо способ совместного использования состояния и предоставления свойства, представляющего это состояние. То, как вы делитесь состоянием, сильно зависит от того, как создаются ваши ViewModels (и, возможно, другие факторы). Например, если ваши две виртуальные машины создаются каким-либо родительским объектом, родительский объект может создать один экземпляр и передать его обеим виртуальным машинам в своих конструкторах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...