gpt4 book ai didi

wpf - 如果RelativeSource不存在则隐藏DataTrigger

转载 作者:行者123 更新时间:2023-12-02 17:52:38 25 4
gpt4 key购买 nike

我想将 DataTrigger 添加到我的基本 TextBox 样式中,以便将前景色设置为不同的值(如果它位于选定的 DataGridCell 内部)。这是我的触发器的样子:

<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}, Path=IsSelected}"
Value="True">
<Setter Property="Foreground"
Value="White" />
</DataTrigger>
</Style.Triggers>

这非常有效,除了当我的 TextBox 不在 DataGrid 中时,绑定(bind)失败并向输出窗口写入异常。我怎样才能防止这种情况。

我基本上想说,如果 Parent 是 DataGridCell,则应用此触发器,否则忽略它。

最佳答案

一般来说,仅在适用的情况下应用样式。如果您想要隐式应用程序,请使用嵌套样式:

<Style TargetType="{x:Type DataGrid}">
<Style.Resources>
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}, Path=IsSelected}"
Value="True">
<Setter Property="Foreground" Value="White" />
</DataTrigger>
</Style.Triggers>
</Style>
</Style.Resources>
</Style>

如果您有其他部分想要应用于所有文本框,请以锯齿状样式取出这些部分并使用 BasedOn采用适用于 DataGrid 内的文本框的样式。


编辑:如果不满足条件,MultiDataTrigger 似乎会立即返回,因此您可以避免绑定(bind)错误:

<Style TargetType="{x:Type TextBox}">
<Style.Resources>
<vc:HasAncestorOfTypeConverter x:Key="HasAncestorOfTypeConverter" AncestorType="{x:Type DataGridCell}" />
</Style.Resources>
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource HasAncestorOfTypeConverter}}"
Value="True" />
<Condition
Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}, Path=IsSelected}"
Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Red" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
public class HasAncestorOfTypeConverter : IValueConverter
{
public Type AncestorType { get; set; }

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return false;
DependencyObject current = value as DependencyObject;
while (true)
{
current = VisualTreeHelper.GetParent(current);
if (current == null)
{
return false;
}
if (current.GetType() == AncestorType)
{
return true;
}
}
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}

这当然会导致相当大的开销,因此它可能不是一个很好的解决方案,然后,如果relativesource绑定(bind)失败,它也必须首先沿着树向上走。

关于wpf - 如果RelativeSource不存在则隐藏DataTrigger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6282500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com