ItemsControl с несколькими DataTemplates для viewmodel
возможно ли связать элемент управления с canvasом в качестве шаблона с несколькими DataTemplates?
У меня есть 2 коллекции, и в зависимости от типа я хотел бы отобразить другой элемент управления на моем canvasе.
Я не уверен, но я мог думать о Viewmodel, который имеет 2 ObservableCollections. Например, если бы у меня были «Shapes» и «connections», и я хотел бы отображать их как на canvasе? В случае сценария диаграммы …
- Связывающие свойства в коде
- Image UriSource и привязка данных
- Когда следует использовать # и = в элементах управления ASP.NET?
- Для чего нужен DataContext?
- Связывание WPF ComboBox с пользовательским списком
Я хотел бы сделать это в mvvm-манере, и я не уверен, правильный подход к DataTemplate верен, но это мне пришло в голову. Но у меня все еще есть проблемы, чтобы получить привязку прямо в моей голове. Если я установил DataContext для ViewModel для меня, кажется невозможным привязать 2 коллекции к элементам управления … = (Я также открыт для других идей …
Это возможно? И если да, то как бы привязка выглядела бы как
- Как обнаружить сломанные привязки данных WPF?
- Как я могу привязать данные строк к ListBox в WPF / WP7?
- Заполнить Combobox из базы данных
- Какие подходы доступны для фиктивных данных времени разработки в WPF?
- Есть ли способ определить, где объявляется / создается привязка WPF?
- Принуждение WPF TextBox больше не работает в .NET 4.0
- Нажатие свойств GUI только для чтения обратно в ViewModel
- Перетаскивание из источника данных в окно WPF не работает
Вы можете создать несколько 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, каждый из которых имеет свои собственные шаблоны и привязан к их собственным коллекциям. Определите их каждый в одном и том же физическом пространстве и просто контролируйте, какой из них отображается на основе вашего состояния. Вы даже можете сделать это с помощью диспетчера визуальных состояний и пользовательских состояний.