C# 动态更改代码隐藏文件中的数据模板

C# 动态更改代码隐藏文件中的数据模板,c#,wpf,xaml,C#,Wpf,Xaml,我有下面的DataTemplate,它根据DirType决定要显示什么.png。当前,如果我们得到DirType为3,则显示./images/file.png <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=DirType}" Value="0"> <Setter Property="Image.Source" TargetName="im

我有下面的DataTemplate,它根据DirType决定要显示什么.png。当前,如果我们得到DirType为3,则显示./images/file.png

<DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=DirType}" Value="0">
                <Setter Property="Image.Source" TargetName="img" Value="./Images/MyComputer.jpg"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=DirType}" Value="1">
                <Setter Property="Image.Source" TargetName="img" Value="./Images/diskdrive.png"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=DirType}" Value="2">
                <Setter Property="Image.Source" TargetName="img" Value="./Images/folder.png"></Setter>
                <Setter Property="Text" TargetName="ObjType" Value="File Folder"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=DirType}" Value="3">
                <Setter Property="Image.Source" TargetName="img" Value="./Images/file.png"></Setter>
                <Setter Property="Text" TargetName="ObjType" Value="{Binding Ext}"></Setter>
                <Setter Property="Visibility" TargetName="ObjSize" Value="Visible"></Setter>
                <Setter Property="Text" TargetName="ObjSize" Value="{Binding Size}"></Setter>
            </DataTrigger>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True" >

            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

然后我在列表框中使用它:

<ListBox x:Name="dirList" Grid.ColumnSpan="3"  IsSynchronizedWithCurrentItem="True"

             ItemTemplate="{StaticResource DirViewTemplate}" BorderThickness="0" 
             HorizontalContentAlignment="Left" VerticalContentAlignment="Top" 
             Grid.Column="0" Grid.Row="1" 
             ScrollViewer.HorizontalScrollBarVisibility="Disabled"
             SelectedItem="{Binding Path=CurrentItem,Mode=OneWayToSource}"
             MouseDoubleClick="dirList_MouseDoubleClick"
             KeyDown="dirList_KeyDown">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" ItemWidth="220"></WrapPanel>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
    </ListBox>

现在,我想根据文件类型动态更改为file type value=3显示的图像。以前,所有文件都在列表框中显示相同的图标,但现在我希望它们拖动Windows资源管理器中显示的图标。在将项目添加到列表时,我尝试动态访问DataTemplate,但无法使其工作


有什么建议吗?

使用多数据触发器。这定义了许多条件,对于要应用的触发器的setter来说,所有这些条件的计算结果都是true

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Path=DirType}" Value="3" />
        <Condition Binding="{Binding Path=Ext}" Value="txt" />
    </MultiDataTrigger.Conditions>
    <Setter TargetName="img" Property="Source" Value="./Images/txt-file.png" />
</MultiDataTrigger>

这里有两个条件,一个绑定到
DirType
属性值,另一个绑定到
Ext
属性值。如果
DirType
为“3”且
Ext
为“txt”,则将应用setter(即图像源将更改为使用不同的图像文件)

只需在XAML中重复触发器,更改绑定值,即可处理其他文件类型