首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >交换控制模板

交换控制模板
EN

Stack Overflow用户
提问于 2017-09-06 11:48:26
回答 3查看 75关注 0票数 0

我有一个WPF项目(C#,Visual 2010,MVVM),我有一个问题。

目前,我在ListBox中有一个项目模板。这看起来如下:

代码语言:javascript
运行
复制
 <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”。我希望在其中有一个属性来决定使用哪个模板。

这个是可能的吗?如果是的话,如何才能做到呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-06 12:36:25

您可以像这样使用<DataTemplate.Triggers>

代码语言:javascript
运行
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2017-09-06 12:05:08

尝试使用DataTrigger

代码语言:javascript
运行
复制
 <DataTrigger Binding="{Binding ElementName=myElement,Path=IsChecked}"
              Value="True">
        <Setter Property="Template"
                Value="{StaticResource myTemplate}"/>
  </DataTrigger>

例如,如果选中复选框,上述内容将交换模板。

票数 2
EN

Stack Overflow用户

发布于 2017-09-06 12:07:42

您可以使用带有DataTrigger模板的样式拇指,并将其绑定到ViewModel中的属性,即YourProperty

代码语言:javascript
运行
复制
<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>

示例属性实现:

代码语言:javascript
运行
复制
public int YourProperty {set;get;} = 0;

您还可以使用一些Enum,以便更容易地理解哪个模板是哪个,甚至是字符串。

如果您只想交换ListBoxItem的模板,可以使用Listbox的内置ItemTemplateSelecetor。这是示例

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46074428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档