Ich habe 2 Sätze von Textblöcken einige von ihnen sind in einem itemcontrol und einige von ihnen sind nicht, Ich möchte einen Stil (nur basierend auf Typ), die den Hintergrund setzt der Textblock, wenn sein Vorgänger ein ItemControl ist.
Ich kann es durch den folgenden Code tun, aber das Problem ist, dass auf dem Protokoll (und Ausgabefenster) eine Fehlermeldung angezeigt wird wegen der Textblöcke, die Itemcontrol nicht als Vorfahren haben. Gibt es eine bessere Möglichkeit, diese Aufgabe auszuführen und diese Fehlermeldung zu vermeiden?Einstellung Stil basierend auf der Existenz eines Vorfahren
<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>
Convertor:
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();
}
}
Fehlermeldung:
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')
Es kann eine andere Art und Weise sein, den Wert zu setzen, aber in diesem Fall werden Sie immer noch den Fehler in der Ausgabe erhalten, da der Nullwert die Frage, die Vorfahren nicht das Hauptproblem ist, nicht vorhanden ist, möchte ich vermeiden der Fehler dort. –
Ich habe nicht getestet, ob der Fehler immer geworfen wird, aber laut msdn sollte es nicht der Fall sein. FallbackValue bedeutet den Wert, der verwendet wird, wenn keiner gefunden wurde. Ich denke also nicht, dass ein Fehler ausgelöst wurde, wenn der FallbackValue nicht benutzt wird. –