소스 데이터에 따라 WPF 그리드의 이미지를 다른 컨트롤로 교체하려면 어떻게해야합니까?

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

  •  05-07-2019
  •  | 
  •  

문제

나는 그렇게처럼 배치 된 그리드가 있습니다.

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

이 모든 것이 잘 작동하지만 이제 ListView에서 선택한 항목에 이미지가 없을 때 '미안, 이미지 없음'이라는 다른 컨트롤 세트로 이미지를 변경하고 싶습니다.

이미지를 DockPanel로 감싸고 데이터 템플릿을 설정하려고 시도했지만 (따라서 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 and Jobi)이 자리를 잡았습니다. 감사합니다.

도움이 되었습니까?

해결책

DataTemplate을 사용하려면 템플릿을 사용하여 객체를 렌더링하는 컨트롤이 있어야합니다. ContentPresEnter를 사용하는 경우 ContentTemplate을 원하는대로 데이터 템플릿으로 설정할 수 있습니다.

내가 이것을하는 방법은 다음과 같습니다.

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

다른 팁

WPF 비주얼 트리에서 비주얼이 생성되는 것에 대해 걱정하지 않는다면 여기서 쉬운 트릭을 수행 할 수 있습니다. 이미지 컨트롤을 '사용할 수없는'컨트롤 위에 놓으십시오. 언제든지 이미지로드가 실패 할 수 있도록 벨로우즈 메시지를 볼 수 있습니다. 이미지 제어가 성공하면 '사용하지 않음'메시지가 이미지에 겹치게됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top