我有分层数据,我希望在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)
答案 0 :(得分:1)
在基本视图模型上有一个String ImagePath
属性并覆盖get访问器或在派生类型的构造函数中设置Property
答案 1 :(得分:1)
最简单的方法是可以通过属性区分差异,可以通过DataTrigger
进行检查。例如,如果TypeId
属性是值为foo
和bar
的字符串或枚举,则可以将类似这样的样式应用于图像:
<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>