Настройка стиля на основе существования типа предка
У меня есть 2 набора текстовых блоков, некоторые из которых находятся в элементе управления контентом, а некоторые нет, я хочу создать стиль (только на основе типа), который устанавливает фон текстового блока, если его предком является ItemControl.
Я могу сделать это с помощью следующего кода, но проблема в том, что в журнале (и окне вывода) будет отображаться сообщение об ошибке привязки данных из-за текстовых блоков, которые не имеют Itemcontrol в качестве ancestore. Есть ли лучший способ сделать эту задачу и избежать этого сообщения об ошибке?
<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();
}
}
Сообщение об ошибке:
Ошибка System.Windows.Data: 4: Не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.ItemsControl ', AncestorLevel =' 1 ''. BindingExpression: Path =; DataItem = NULL; целевым элементом является TextBlock (Name = ''); Свойство target - «NoTarget» (тип «Объект»).