我有 2 套,TextBlocks
其中一些在一个中ItemControl
,而其中一些不在。
我想制作一种样式(仅基于类型),TextBlock
如果它的祖先是ItemControl
.
我可以使用以下代码来做到这一点,但我的问题是在日志(和输出窗口)上显示了一条数据竞价错误消息,因为TextBlocks
它们没有ItemControl
作为它们的祖先。
有没有更好的方法来完成此任务并避免此错误消息?
<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>
转换器:
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''的绑定源。绑定表达式:路径=;数据项=空;目标元素是'TextBlock'(名称='');目标属性是“NoTarget”(类型“对象”)