콘텐츠 구성에 컨텐츠가 널리 사용되거나 비어있을 때 기본 데이터 emplate을 표시합니까?
-
07-07-2019 - |
문제
나는 이것이 가능하다고 생각하지만 명백한 방법은 작동하지 않습니다.
현재 나는 이것을하고있다 :
<ContentControl
Content="{Binding HurfView.EditedPart}">
<ContentControl.Resources>
<Style
TargetType="ContentControl"
x:Key="emptytemplate">
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}"
Value="{x:Null}">
<Setter
Property="ContentControl.Template">
<Setter.Value>
<ControlTemplate>
<Grid
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Resources>
</ContentControl>
바인딩 오류가 발생하지 않으며이 컴파일됩니다. 그러나 예상 결과는 생성되지 않습니다. 나는 또한 명백한 것을 시도했다 :
<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>
이것은 컴파일하지 않습니다. 컨텐츠를 두 번 설정하려는 시도도 실패합니다.
<ContentControl
Content="{Binding HurfView.EditedPart}">
<TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>
사용자 정의 템플릿 선택기를 쓰지 않고이 작업을 수행 할 수 있습니까?
해결책
간단하게, 당신은 스타일로 컨텐츠 속성을 바인딩해야합니다. 값이 NULL로 평가하더라도 바인딩 존재가있는 경우 스타일은 컨트롤에 값을 덮어 쓰지 않습니다. 이 시도.
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentControl">
<Setter Property="Content" Value="{Binding HurfView.EditedPart}" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}" Value="{x:Null}">
<Setter Property="ContentControl.Template">
<Setter.Value>
<ControlTemplate>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
다른 팁
나는이 질문을 우연히 발견하고 오늘 같은 문제를 겪었 기 때문에 문제를 해결하는 방법을 다른 방법으로 기여하고 싶었습니다. 다른 스타일 트리거를 추가하고 싶지 않기 때문에 속성을 사용했습니다. TargetNullValue
허용 된 솔루션보다 조금 더 읽기 쉬운 것 같습니다 (그럼에도 불구하고 작동).
<ContentControl>
<ContentControl.Content>
<Binding Path="ContentViewModel">
<Binding.TargetNullValue>
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</Binding.TargetNullValue>
</Binding>
</ContentControl.Content>
</ContentControl>
DBNULL.Value를 ContentControl의 내용에 대한 바인딩의 폴백 값으로 반환하고 dbnull에 대한 DataTemplate을 만들 수 있습니다.
<DataTemplate DataType="{x:Type system:DBNull}">
<!-- The default template -->
</DataTemplate>
...
<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
제휴하지 않습니다 StackOverflow