根据ViewModels类型设置图像源

时间:2014-02-03 16:47:15

标签: c# wpf image datatemplate

我有分层数据,我希望在TreeView内显示。 所有这些对象都有一个公共基类,Bindings与该基类一起使用。 现在,我想显示不同的Image,具体取决于ViewModel的类型。

现在我有一个HierachicalDataTemplate

<HierarchicalDataTemplate DataType="{x:Type viewModels:ItemBaseViewModel}" ItemsSource="{Binding Children}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="20*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100*" />
            <ColumnDefinition Width="5" />
            <ColumnDefinition Width="100*" />
            <ColumnDefinition Width="100*" />
            <ColumnDefinition Width="100*" />
        </Grid.ColumnDefinitions>

        <Image Grid.Column="0"
               Height="12"
               Source="/Client;component/Images/icon.png" />

        <TextBlock Grid.Column="2" Text="{Binding DisplayString}" />
    </Grid>
</HierarchicalDataTemplate>

为BarooModel显示bar.png和为FooViewModel显示foo.png的最简单方法是什么? (它们都来自ItemBaseViewModel)

2 个答案:

答案 0 :(得分:1)

在基本视图模型上有一个String ImagePath属性并覆盖get访问器或在派生类型的构造函数中设置Property

答案 1 :(得分:1)

最简单的方法是可以通过属性区分差异,可以通过DataTrigger进行检查。例如,如果TypeId属性是值为foobar的字符串或枚举,则可以将类似这样的样式应用于图像:

<Style TargetType="Image">
    <Setter Property="Source" Value="foo.png" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=TypeId}" Value="bar">
            <Setter Property="Source" Value="bar.png" />
        </DataTrigger>
    </Style>
</Style>

另一种方法是利用DataTemplate定义的DataType资源将自动应用于该类型的事实。但是,不是让全局资源为每种类型重新实现整个模板,而是可以在主模板中放置ContentControl,只为图像部分提供自己的本地资源:

<ContentControl Grid.Column="0" Content="{Binding}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type viewModels:foo}">
            <Image Source="foo.png" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModels:bar}">
            <Image Source="bar.png" />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>