我有一个像这样的网格;
+---------+---------+
| Image | Details |
| is | pane |
| here | for data|
| | entry |
+---------+---------+
| ListView here to |
| select data item |
| for top two panes |
+---------+---------+
这一切都运作良好,但我现在想要将图像更改为另一组控件,当列表视图中的所选项目没有图像时,“抱歉,没有图像可用”
我尝试将图像包装在DockPanel中并在那里设置DataTemplate(所以我可以使用DataTriggers)但IntelliSense说没有!
ListView使用DataTriggers做类似的事情,但正如我所说,我无法理解如何为一个似乎无法访问DataTemplate的单个图像做到这一点。
简化的XAML如下;
<Grid DataContext="{Binding Source={StaticResource MyData}}">
<!-- row 0 col 0 -->
<Image x:Name="imgPhoto" Source="{Binding ElementName=MyListViewOfData, Path=SelectedItem.PathToImageOnDisk}" />
<!-- row 0 col 1 -->
<StackPanel DataContext="{Binding ElementName=MyListViewOfData, Path=SelectedItem}">
<TextBox Name="NameTextBox" Text="{Binding Name}" />
<TextBlock Name="DateCreatedTextBlock" Text="{Binding DateCreated}" />
</StackPanel>
<!-- row 1 cols 0,1 -->
<ListView ItemsSource="{Binding}" ItemTemplate="{StaticResource MyListViewTemplate}"
IsSynchronizedWithCurrentItem="True" Name="MyListViewOfData" />
</Grid>
先谢谢WPF大师。
赖安
更新:以下两个答案(Abe和Jobi)都是现货,谢谢。
答案 0 :(得分:3)
要使用DataTemplate,您必须拥有一个使用该模板渲染对象的控件。如果您使用ContentPresenter,则可以将其ContentTemplate设置为您喜欢的任何DataTemplate。
我将如何做到这一点:
<Grid DataContext="...">
<ContentPresenter Content="{Binding SelectedItem, ElementName=MyListViewOfData}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image x:Name="imgPhoto" Source="{Binding PathToImageOnDisk}" />
<TextBlock x:Name="error" Visibility="Collapsed" Text="Sorry, no image available" />
<StackPanel Grid.Column="1">
<TextBox Name="NameTextBox" Text="{Binding Name}" />
<TextBlock Name="DateCreatedTextBlock" Text="{Binding DateCreated}" />
</StackPanel>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding PathToImageOnDisk}" Value="{x:Null}">
<Setter TargetName="imgPhoto" Property="Visibility" Value="Collapsed" />
<Setter TargetName="error" Property="Visibility" Value="Visible" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
<ListView ItemsSource="{Binding}" ItemTemplate="{StaticResource MyListViewTemplate}" IsSynchronizedWithCurrentItem="True" Name="MyListViewOfData" />
</Grid>
答案 1 :(得分:2)
如果您不关心在WPF可视化树中创建的视觉效果,那么您可以在这里做一个简单的技巧。 只需将Image控件置于“不可用”控件的顶部,这样在任何时候图像加载失败,您都可以看到下面的消息。如果图像控制成功,则“不可用”消息将被图像重叠。