1

私はそのようにレイアウトされたグリッドを持っています;

+---------+---------+
|  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) は的確でした、ありがとう。

4

2 に答える 2

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>
于 2009-01-08T17:50:41.417 に答える
2

ビジュアルが WPF ビジュアル ツリーで作成されることを気にしない場合は、ここで簡単なトリックを実行できます。Image コントロールを「Not available」コントロールの上に配置するだけで、いつでも Image の読み込みに失敗すると、次のメッセージが表示されるようになります。画像制御が成功した場合、「使用できません」というメッセージが画像に重なって表示されます。

于 2009-01-08T17:59:31.163 に答える