Question

Je pense que c'est possible, mais la solution évidente ne fonctionne pas.

Actuellement, je fais ceci:

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

Je ne reçois aucune erreur de liaison et cela compile. Cependant, cela ne produit pas le résultat attendu. J'ai aussi essayé l'évidence:

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

Ceci ne compilera pas. Et tenter de définir le contenu deux fois échoue également:

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

Puis-je faire cela sans écrire un sélecteur de modèle personnalisé?

Était-ce utile?

La solution

Simple, vous devez lier la propriété content dans le style. Les styles n'écraseront pas une valeur sur un contrôle s'il existe une liaison, même si la valeur est évaluée à Null. Essayez ceci.

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

Autres conseils

Depuis que je suis tombé sur cette question et que j’ai le même problème aujourd’hui, je souhaitais apporter une contribution différente en résolvant le problème. N'ayant pas aimé ajouter un autre déclencheur de style, j'ai utilisé la propriété TargetNullValue qui semble être un peu plus lisible que la solution acceptée (qui fonctionne néanmoins):

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

Vous pouvez renvoyer DBNull.Value en tant que valeur de repli de la liaison pour le contenu du ContentControl et créer un DataTemplate pour DBNull:

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

...

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top