WPF MVVM Легкие динамические представления и датагрейды

Хорошо, у меня здесь есть довольно сложная функциональность. Я хотел бы знать A) Если я делаю это правильно. Если нет, что я должен изменить? 2) Если это правильно, то каково наилучшее решение моей проблемы?

У меня есть главное окно со списком элементов ListView. Если я нажму на один из них, в правой колонке Grid в этом окне должно быть заполнено DataGrid информацией о выбранном элементе. Если я щелкнул другой элемент в ListView, он должен измениться на другой DataGrid.

Я видел некоторые примеры ContentPresenter, но я не могу заставить это работать, поэтому я удалил его и покажу вам код, который у меня есть. Прямо сейчас, у меня есть только одна настройка элемента, поэтому я буду придерживаться этого примера драйвера.

DriverGrid.xaml

<usercontrol datacontext="{Binding AdminDriver, Source={StaticResource Locator}}">
 <grid>

 <datagrid>
 //stuff here for datagrid
 </datagrid>

 <button content="Edit" command="{Binding ShowEditWindow}">
 </button></grid></usercontrol><button content="Add" command="{Binding ShowAddWindow}"><code></code> <p> <span>AdminDriver.cs(VM)</span></p> <pre class="prettyprint linenums">//Contains variables, and is the datacontext for the above usercontrol

AdminMain.xaml (просмотр для всех материалов администратора)

//Contains a bunch of junk for the min admin screen which has the listview with the options in it. If you require this piece of code, I can trim it down but I don't se currently see it relevance. The DataGrid belongs in this window, I'm assuming in a Content Presenter. Here is the ListView that is in column 1 of 2.

 <listview itemssource="{Binding AdminMenu}" name="AdminFields" selectionmode="Single">
 <i:interaction.triggers>
 <i:eventtrigger eventname="SelectionChanged">
 <cmd:eventtocommand commandparameter="{Binding SelectedItem, ElementName=AdminFields}" command="{Binding registerSelected}">
 </cmd:eventtocommand></i:eventtrigger>
 </i:interaction.triggers>
 <listview.itemtemplate>
 <itemcontainertemplate>
 <textblock text="{Binding FieldName}">
 </textblock></itemcontainertemplate>
 </listview.itemtemplate>
 </listview>
1 ответ

Я бы взял привязку DataContext из UserControl. Это позволит вам использовать его в других местах, если вам когда-либо понадобится. Вместо этого просто привяжите DataContext, где вы его используете.

Если вы хотите представить различные UserControls на основе того, какой элемент выбран в ListView, вы будете использовать ContentPresenter. Все элементы в вашем ItemsSource будут иметь тот же базовый класс или реализовать один и тот же интерфейс, чтобы вы могли поместить их в тот же ObservableCollection. Я предполагаю, что AdminDriver будет такого типа/интерфейса, как и тогда.

Вы должны установить некоторые DataTemplates в верхней части окна, которые сопоставляют возможные реальные типы объектов в вашем ItemsSource (AdminMenu) с UserControl, которые будут представлять их.

<window.resource>
 <datatemplate datatype="{x:Type model:TypeA}">
 <view:usercontrola>
 </view:usercontrola></datatemplate>

 <datatemplate datatype="{x:Type model:TypeB}">
 <view:usercontrolb>
 </view:usercontrolb></datatemplate>
 //rinse and repeat
</window.resource>

Затем вы добавите ContentPresenter в Grid и привяжите его DataContext к свойству AdminDriver. Появится UserControl, соответствующий фактическому типу выбранного элемента, отображаемому в ваших DataTemplates.

licensed under cc by-sa 3.0 with attribution.