Ho 2 set di TextBlocks alcuni di loro sono in un itemcontrol e alcuni di loro non sono, Voglio fare uno stile (solo in base al tipo), che stabilisce il fondo di il blocco di testo se il suo antenato è un oggetto ItemControl.
Posso farlo tramite il seguente codice, ma il problema è che sul log (e sulla finestra di output) verrà visualizzato un messaggio di errore nell'input dei dati a causa dei blocchi di testo che non hanno ItemControl come antenato. C'è un modo migliore per fare questo compito ed evitare questo messaggio di errore?stile impostazione in base all'esistenza di un tipo antenato
<Grid>
<Grid.Resources>
<local:HasAncestorConverter x:Key="HasAncestorConverter" />
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, Converter={StaticResource HasAncestorConverter}}" Value="True">
<Setter Property="Background"
Value="{Binding Tag,
RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<StackPanel>
<TextBlock Text="Out of ItemControl" />
<ItemsControl Tag="Blue" >
<TextBlock Text="Inside of ItemControl" />
</ItemsControl>
</StackPanel>
</Grid>
Converter:
class HasAncestorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value != null;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Messaggio di errore:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'NoTarget' (type 'Object')
Può essere un altro modo per impostare il valore, ma in questo caso si continua a ottenere l'errore in uscita perché il valore null non è il problema principale del problema è che antenato non esiste, voglio evitare l'errore lì. –
Non ho provato se l'errore verrà sempre lanciato ma secondo msdn non dovrebbe essere il caso. FallbackValue indica il valore che verrà utilizzato quando non è stato trovato alcun valore. Quindi non penso che sia stato lanciato un errore quando non si è trovato il valore FallbackValue. –