Come posso sostituire un'immagine in una griglia WPF con un altro controllo a seconda dei dati di origine?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Ho una griglia strutturata in questo modo;

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

Funziona tutto bene, ma ora vorrei cambiare l'immagine con un'altra serie di controlli che dice "Siamo spiacenti, nessuna immagine disponibile" quando l'elemento selezionato nella lista non ha un'immagine

Ho provato a racchiudere l'immagine in un DockPanel e ad impostare lì un DataTemplate (così posso usare DataTriggers) ma IntelliSense dice di no!

ListView utilizza DataTriggers per fare una cosa simile, ma come ho detto non riesco a capire come farlo per una singola immagine che non sembra avere accesso a un DataTemplate.

XAML semplificato è inferiore;

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

Grazie in anticipo ai guru del WPF.

Ryan

Aggiornamento: entrambe le risposte di seguito (Abe e Jobi) sono state esatte, grazie.

È stato utile?

Soluzione

Per utilizzare un DataTemplate, è necessario disporre di un controllo che utilizza il modello per eseguire il rendering di un oggetto. Se si utilizza ContentPresenter, è possibile impostare ContentTemplate su DataTemplate come desiderato.

Ecco come lo farei:

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

Altri suggerimenti

Puoi fare un semplice trucco qui, se non sei preoccupato per gli oggetti visivi creati nell'albero visivo di WPF. Posiziona semplicemente il controllo Immagine sopra il controllo "Non disponibile" in modo che in qualsiasi momento il caricamento dell'immagine non riesca, potrai vedere il messaggio qui sotto. Se il controllo dell'immagine ha esito positivo, il messaggio "Non disponibile" viene sovrapposto dall'immagine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top