如何根据源数据将WPF网格中的图像替换为另一个控件?

时间:2009-01-08 15:09:09

标签: wpf data-binding datatrigger

我有一个像这样的网格;

+---------+---------+
|  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)都是现货,谢谢。

2 个答案:

答案 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控件置于“不可用”控件的顶部,这样在任何时候图像加载失败,您都可以看到下面的消息。如果图像控制成功,则“不可用”消息将被图像重叠。