Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 交换控制模板_C#_Wpf_Mvvm_Listbox - Fatal编程技术网

C# 交换控制模板

C# 交换控制模板,c#,wpf,mvvm,listbox,C#,Wpf,Mvvm,Listbox,我有一个WPF项目(C#,VisualStudio2010,MVVM),我有一个问题 目前,我在列表框中有一个项目模板。情况如下: <ListBox.ItemTemplate> <DataTemplate> <Grid> <Thumb Name="myThumb" Template="{StaticResource NodeVisualTemplate}"> <

我有一个WPF项目(C#,VisualStudio2010,MVVM),我有一个问题

目前,我在列表框中有一个项目模板。情况如下:

 <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都有一个数据上下文,即“ChatNodeDeviceModel”。我希望有一个属性,可以决定使用哪个模板


这可能吗?如果是这样,怎么做?

尝试使用
DataTrigger

 <DataTrigger Binding="{Binding ElementName=myElement,Path=IsChecked}"
              Value="True">
        <Setter Property="Template"
                Value="{StaticResource myTemplate}"/>
  </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>
您还可以使用一些枚举,以便更容易地理解哪个模板是哪个模板,甚至是字符串


如果只想交换ListBoxItem的模板,可以使用Listbox的内置ItemTemplateSelector。以下是您可以使用样式化的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>
您还可以使用一些枚举,以便更容易地理解哪个模板是哪个模板,甚至是字符串

如果只想交换ListBoxItem的模板,可以使用Listbox的内置ItemTemplateSelector。以下是您可以像这样使用

<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>

您可以这样使用

<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>


我是用myThumb替换myElement,还是用其他东西?谢谢。是的,您的
Thumb
将是您想要绑定到的元素,我是否要用myThumb替换myElement,或者这是其他东西?谢谢。是的,您的
拇指将是您想要绑定到的元素