소스 데이터에 따라 WPF 그리드의 이미지를 다른 컨트롤로 교체하려면 어떻게해야합니까?
-
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 비주얼 트리에서 비주얼이 생성되는 것에 대해 걱정하지 않는다면 여기서 쉬운 트릭을 수행 할 수 있습니다. 이미지 컨트롤을 '사용할 수없는'컨트롤 위에 놓으십시오. 언제든지 이미지로드가 실패 할 수 있도록 벨로우즈 메시지를 볼 수 있습니다. 이미지 제어가 성공하면 '사용하지 않음'메시지가 이미지에 겹치게됩니다.
제휴하지 않습니다 StackOverflow