Обмен шаблонами управления

У меня есть проект WPF (C#, Visual Studio 2010, MVVM), и у меня есть вопрос.

В настоящее время у меня есть шаблон элемента в ListBox. Это выглядит следующим образом:

 <ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}">

                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="DragDelta">
                        <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
                    </i:EventTrigger>

                </i:Interaction.Triggers>
            </Thumb>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

Шаблон "NodeVisualTemplate" представляет собой серию элементов управления (например, границы и текстовые поля).

То, что я не знаю, как сделать, и что я хотел бы сделать, - это возможность поменять этот шаблон на другой, основываясь на свойствах этого элемента. В ListBox каждый ListBoxItem имеет контекст данных, который является "ChatNodeViewModel". Я надеялся иметь свойство в том, что будет диктовать, какой шаблон был использован.

Это возможно? Если так, как это можно сделать?

3 ответа

Решение

Вы могли бы использовать <DataTemplate.Triggers> как это:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="DragDelta">
                        <cmd:EventToCommand Command="{Binding ChatNodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Thumb>
        </Grid>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding YourProperty}" Value="1">
                <Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateOne}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding YourProperty}" Value="2">
                <Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateTwo}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding YourProperty}" Value="3">
                <Setter TargetName="myThumb" Property="Template" Value="{StaticResource NodeVisualTemplateThree}" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</ListBox.ItemTemplate>

Попробуйте использовать DataTrigger

 <DataTrigger Binding="{Binding ElementName=myElement,Path=IsChecked}"
              Value="True">
        <Setter Property="Template"
                Value="{StaticResource myTemplate}"/>
  </DataTrigger>

Например, приведенное выше поменяет шаблон, если установлен флажок

Вы можете использовать стиль Thumb с шаблоном в DataTrigger и привязать его к свойству в ViewModel, т.е. YourProperty,

<Thumb>
    <Thumb.Style>
        <Style TargetType="Thumb">
            <Setter Property="Template"  Value="{StaticResource NodeVisualTemplate}"/>
            <!--default Template ^-->
            <Style.Triggers>
                <DataTrigger Binding="{Binding YourProperty}" Value="0">
                    <Setter Property="Template" Value="{StaticResource TemplateOn0}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding YourProperty}" Value="1">
                    <Setter Property="Template" Value="{StaticResource TemplateOn1}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding YourProperty}" Value="2">
                    <Setter Property="Template" Value="{StaticResource TemplateOn2}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Thumb.Style>
</Thumb>

Пример реализации свойства:

public int YourProperty {set;get;} = 0;

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

Если вы хотите просто поменять шаблон ListBoxItem, вы можете использовать встроенный в Listbox ItemTemplateSelecetor. Вот образец

Другие вопросы по тегам