Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Привязка к ComboBoxItem

#c_sharp #wpf #xaml


Есть несколько гридов. Все они скрыты до тех пор пока в ComboBoxне выбрано ComboBoxItem.
Когда выбираю один из ComboBoxItem должен появиться соответственно один из гридов.
Привязку пытаюсь сделать в XAML без вью модели:

  


Cash это Item в Сombobox но сам грид виден независимо от того выбрано ли что то в
боксе вообще. Как исправить это расширение разметки ?
    


Ответы

Ответ 1



Обычно такую задачу решают следующим образом. У вас есть коллекция VM-объектов, каждый из которых содержит данные для своего грида и строки комбобокса. Вы привязываете это коллекцию к ItemsSource комбобокса, устанавливаете DisplayMemberPath на то, что должно показываться в комбобоксе. Для показа грида вы используете Binding, если все гриды одинаковые и отличаются только данными. Либо ContentPresenter и набор DataTemplate'ов, если они разные. Пример: VM-класс: class ItemVM { public string Header { get; } public string Content { get; } public ItemVM(string header, string сontent) { Header = header; Content = Content; } } Ну и обёртка для коллекции: class MainVM { public IEnumerable Items { get; private set; } public ItemVM SelectedItem { get; set; } // ещё нужен конструктор } XAML (я тут показываю простой случай, с одинаковым лэйаутом для гридов): Результат: Заметьте, что SelectedItem="{Binding SelectedItem}" нужно лишь затем, чтобы сделать начальное значение в комбобоксе пустым. Больше это значение в коде не используется (хотя оно может вам понадобиться ещё где-нибудь в VM).

Ответ 2



В вашем вопросе на мой взгляд содержаться два отдельных. Первый - это как отображать элемент только в том случае, когда есть выбранный элемент. Эту проблему можно решить с помощью триггера с проверкой на то, что SelectedIndex != -1. Простейший пример: для полноты примера привожу тривиальный контекст для данных module Context2 = open Gjallarhorn.Bindable let create() = let source = Binding.createSource() [|"Some1"; "Some2" ; "Some3" |] |> Binding.constantToView "Data" <| source source Второй - как в зависимости от выбранного элемента в списке отобразить соответствующие данные. Если вкратце - вы создаете список из "страничных" VM и привязываете его к вашему ComboBox. Выбранный элемент вы можете непосредственно отображать в ContentControl через привязку к SelectedItem или завести свойство в основной VM которое и будет отвечать за выбранную VM. На этот счет есть замечательная статья Navigation with MVVM, где вы можете прочитать об этом подходе более подробно, а также посмотреть на реализацию простого примера.

Комментариев нет:

Отправить комментарий