动态更改文件后面的代码中的DataTemplate

时间:2015-03-13 20:55:15

标签: 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="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中使用它:

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

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

使用 MultiDataTrigger 。这定义了许多条件,对于要应用的触发器设置器,所有这些条件都评估为真。

<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是&#34; 3&#34;并且Ext是&#34; txt&#34;然后将应用setter(即图像源将更改为使用不同的图像文件)。

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