Разница при настройке ContentTemplate через имя, чем через вывод типа - PullRequest
1 голос
/ 03 марта 2011

Я недавно начал изучать WPF + MVVM. Возможно, у меня неправильный конец палки или неправильная палка полностью в соответствии с тем, как все должно быть сделано.

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

Верх привязан к списку заказов. Нижняя часть привязана к текущему выбранному ордеру (идея заключается в том, чтобы отобразить детали этого ордера).

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

В моем mainwindow.xaml у меня вид списка заказов, связанный следующим образом:

<ContentControl Content="{Binding Path=OrdersViewModel}"

Представление подключается в файле ресурсов с помощью:

<DataTemplate DataType="{x:Type vm:AllOrdersViewModel}">
    <vw:AllOrdersView />
</DataTemplate>

Это прекрасно работает, когда приложение запускается, отображаются их заказы. Я сделал то же самое с деталями заказа, чтобы начать с него (т. Е. Он имел только установленный тип данных, а не какой-либо определенный ключ). Это работало хорошо, если не был выбран ни один порядок, то представление не отображалось, а когда был выбран порядок, оно отображалось .

В настоящее время я пытаюсь изменить это на шаблон, чтобы я мог динамически переключать шаблон / представление таким образом, чтобы при нажатии пользователем НОВЫЙ заказ (у модели представления есть Enum, в котором указано текущее состояние заказа, поэтому я бы проверил против значения enum), представление должно измениться.

Если я попробую следующее, оно взорвется. Приложение запускается, отображается список заказов (на данный момент ни один заказ не выбран) и отображается подробное представление, а затем один из конвертеров взрывается из-за зависимостейproperty.unsetvalue (примечание, следует ли мне всегда проверять наличие тот?). В идеале я не хочу, чтобы представление отображалось до тех пор, пока не будет выбран заказ:

<ContentControl Content="{Binding Path=OrderViewModel}" ContentTemplate="{StaticResource ordertemplate}" />

   <DataTemplate x:Key="ordertemplate">
       <TextBlock Text="hello" />
    </DataTemplate>

У меня есть два вопроса в основном:

1) как мне остановить отображение шаблона до тех пор, пока он не будет отображать данные?

2) как я могу динамически переключать представления / шаблоны на основе перечисления?

1 Ответ

2 голосов
/ 03 марта 2011

Самый простой механизм для использования в этой ситуации - это DataTemplateSelector, который содержит написанный вами код, который может исследовать связанный объект, в данном случае ваш ViewModel, и выбрать подходящий шаблон для использования, включая обработку в случае отсутствиявыбор деталей.

<ContentControl Content="{Binding Path=OrderViewModel}" 
                ContentTemplateSelector="{StaticResource MyCustomSelector}" />
...