Zeigen Sie eine StandarddataTemplate in einem ContentControl an, wenn sein Inhalt null oder leer ist?

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

Frage

Ich würde denken, dass dies möglich ist, aber der offensichtliche Weg funktioniert nicht.

Derzeit mache ich das:

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

Ich bekomme keine Bindungsfehler und dieses kompiliert. Es führt jedoch nicht das erwartete Ergebnis. Ich habe auch das Offensichtliche ausprobiert:

<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>

Dies wird nicht kompilieren. Und der Versuch, den Inhalt zweimal festzustellen, schlägt ebenfalls fehl:

<ContentControl
    Content="{Binding HurfView.EditedPart}">
        <TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>

Kann ich dies tun, ohne einen benutzerdefinierten Vorlagenwählers zu schreiben?

War es hilfreich?

Lösung

Einfach, Sie müssen die Inhaltseigenschaft im Stil binden. Styles überschreibt keinen Wert für eine Kontrolle, wenn eine Bindung vorhanden ist, auch wenn der Wert auf NULL bewertet. Versuche dies.

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

Andere Tipps

Da ich auf diese Frage gestoßen bin und heute das gleiche Problem hatte, wollte ich einen anderen Weg beitragen, wie ich das Problem gelöst habe. Da ich keinen weiteren Style -Trigger hinzufügen wollte, habe ich die Eigenschaft verwendet TargetNullValue Das scheint etwas lesbarer zu sein als die akzeptierte Lösung (die dennoch funktioniert):

    <ContentControl>
      <ContentControl.Content>
        <Binding Path="ContentViewModel">
          <Binding.TargetNullValue>
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
              <TextBlock>EMPTY!</TextBlock>
            </Grid>
          </Binding.TargetNullValue>
        </Binding>
      </ContentControl.Content>
    </ContentControl>

Sie können dbnull.Value als Fallbackwert der Bindung für den Inhalt des ContentControl zurückgeben und eine DataTemplate für DBNull erstellen:

<DataTemplate DataType="{x:Type system:DBNull}">
    <!-- The default template -->
</DataTemplate>

...

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top