ItemsControl с несколькими DataTemplates для viewmodel

возможно ли связать элемент управления с canvasом в качестве шаблона с несколькими DataTemplates?

У меня есть 2 коллекции, и в зависимости от типа я хотел бы отобразить другой элемент управления на моем canvasе.

Я не уверен, но я мог думать о Viewmodel, который имеет 2 ObservableCollections. Например, если бы у меня были «Shapes» и «connections», и я хотел бы отображать их как на canvasе? В случае сценария диаграммы …

Я хотел бы сделать это в mvvm-манере, и я не уверен, правильный подход к DataTemplate верен, но это мне пришло в голову. Но у меня все еще есть проблемы, чтобы получить привязку прямо в моей голове. Если я установил DataContext для ViewModel для меня, кажется невозможным привязать 2 коллекции к элементам управления … = (Я также открыт для других идей …

Это возможно? И если да, то как бы привязка выглядела бы как

Вы можете создать несколько ObservableCollections а затем привязать свой ItemsSource к CompositeCollection который объединяет эти коллекции.

Затем в вашем XAML вы можете создавать различные DataTemplates для соответствующих типов, используя свойство DataType которое, подобно стилям, автоматически применяется, если оно помещено в ресурсы. (Вы также можете создать композит в XAML, который отображается в MSDN, если assembly CollectionContainers должна быть связана, что немного сложнее )

Пример кода:

 ObservableCollection data1 = new ObservableCollection(new Employee[] { new Employee("Hans", "Programmer"), new Employee("Elister", "Programmer"), new Employee("Steve", "GUI Designer"), new Employee("Stefan", "GUI Designer"), new Employee("Joe", "Coffee Getter"), new Employee("Julien", "Programmer"), }); ObservableCollection data2 = new ObservableCollection(new Machine[] { new Machine("E12", "GreedCorp"), new Machine("E11", "GreedCorp"), new Machine("F1-MII", "CommerceComp"), new Machine("F2-E5", "CommerceComp") }); CompositeCollection coll = new CompositeCollection(); coll.Add(new CollectionContainer() { Collection = data1 }); coll.Add(new CollectionContainer() { Collection = data2 }); Data = coll; 
                         

Здесь я использую другую панель, но она должна быть одинаковой для canvasа.

У вас может быть ObservableCollection в вашей ViewModel и привязать источник ItemsControl к этой коллекции.

Затем, чтобы получить различный вид для разных типов данных, вы могли бы использовать два DataTemplates без x: Key, но с правильным набором DataType в своих ресурсах. Затем ItemControl автоматически выберет соответствующий DataTemplate для вашего элемента.

Посмотрите на селектор шаблонов данных: здесь или здесь .

Другим вариантом с меньшим количеством кода было бы определение двух ListBoxes, каждый из которых имеет свои собственные шаблоны и привязан к их собственным коллекциям. Определите их каждый в одном и том же физическом пространстве и просто контролируйте, какой из них отображается на основе вашего состояния. Вы даже можете сделать это с помощью диспетчера визуальных состояний и пользовательских состояний.

  • WPF MVVM INotifyPropertyChanged Implementation - модель или ViewModel
  • Связывание Richtextbox wpf
  • Управление несколькими выборами с помощью MVVM
  • WPF: привязка ContextMenu к команде MVVM
  • Привязать к методу в WPF?
  • Связывание в WPF с элементом массива, заданным свойством
  • Общий class наблюдаемого словаря для DataBinding / WPF C #
  • Привязка данных Android с использованием тега include
  • Что означает «{Binding Path =.}» В привязке WPF?
  • ElementName привязка из MenuItem в ContextMenu
  • WPF привязка данных к интерфейсу, а не к фактическому объекту - возможность литья?
  • Давайте будем гением компьютера.