Visualizzare un DataTemplate predefinito in un ContentControl quando il suo contenuto è nullo o vuoto?

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

Domanda

Penso che sia possibile, ma il modo ovvio non funziona.

Attualmente sto facendo questo:

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

Non ricevo errori di associazione e questo viene compilato. Tuttavia, non produce il risultato previsto. Ho anche provato l'ovvio:

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

Questo non verrà compilato. E anche il tentativo di impostare il contenuto due volte fallisce:

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

Posso farlo senza scrivere un selettore di modelli personalizzato?

È stato utile?

Soluzione

Semplice, devi associare la proprietà content allo stile. Gli stili non sovrascriveranno un valore su un controllo se è presente un binding, anche se il valore viene valutato su Null. Prova questo.

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

Altri suggerimenti

Dato che mi sono imbattuto in questa domanda e ho avuto lo stesso problema oggi, volevo contribuire in un altro modo a come ho risolto il problema. Dato che non mi piaceva aggiungere un altro trigger di stile, ho usato la proprietà TargetNullValue che sembra essere un po 'più leggibile della soluzione accettata (che funziona comunque):

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

È possibile restituire DBNull.Value come FallbackValue del Binding per il contenuto di ContentControl e creare un DataTemplate per DBNull:

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

...

<ContentControl Content="{Binding HurfView.EditedPart, FallbackValue={x:Static system:DBNull.Value}}" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top