Wie kann ich ein Bild in einem WPF-Raster mit einer anderen Steuerung in Abhängigkeit von den Quelldaten ersetzen?

StackOverflow https://stackoverflow.com/questions/424562

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe ein Raster wie so angelegt;

+---------+---------+
|  Image  | Details |
|    is   |  pane   |
|  here   | for data|
|         |  entry  |
+---------+---------+
| ListView here to  |
| select data item  |
| for top two panes |
+---------+---------+

Das alles funktioniert gut, aber ich würde jetzt das Bild gerne auf einem anderen Satz von Kontrollen ändern sagen: ‚Leider kein Bild verfügbar‘, wenn das ausgewählte Element in der Listenansicht kein Bild hat

Ich habe versucht, das Bild in einem DockPanel Verpackung und eine Datatemplate dort einstellen (so kann ich DataTriggers verwenden), aber IntelliSense sagt nein!

Das Listview verwendet DataTriggers eine ähnliche Sache zu tun, aber wie ich sage, ich meinen Kopf nicht umgehen kann, wie es für ein einzelnes Bild zu tun, die keinen Zugang zu haben zu einem Datatemplate scheinen.

Simplified XAML ist unten;

<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>

Vielen Dank im Voraus WPF-Gurus.

Ryan

Update:. Beide Antworten unten (Abe und Jobi) waren genau richtig, dank

War es hilfreich?

Lösung

Um eine Datatemplate zu verwenden, haben Sie eine Kontrolle haben, der die Vorlage verwendet wird, ein Objekt zu machen. Wenn Sie einen Content verwenden, können Sie den Content gesetzt ein Datatemplate zu sein, was auch immer Sie mögen.

Hier ist, wie ich dies tun würde:

<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>

Andere Tipps

Sie können einen einfachen Trick tun, wenn Sie nicht besorgt über die Visuals sind erhalten in der WPF visuellen Struktur erstellt. Legen Sie einfach die Bildsteuerung auf der Oberseite der Kontrolle ‚Nicht verfügbar‘, so dass Sie die unten Nachricht zu sehen, wären in der Lage ist fehlgeschlagen jederzeit Bild Last wird. Wenn die Steuerung Bild gelungen dann Meldung ‚Nicht verfügbar‘ durch das Bild überlappt erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top