如何将属性附加到控件或使用在VisualTreeHelper.GetParent()更改时更新的绑定?

时间:2017-07-29 10:23:00

标签: c# wpf data-binding ivalueconverter visualtreehelper

我有一个Button我需要检测它是否进入ToolBarOverflowPanel。

当前代码:

(逻辑:监控Children.Count为AncestorType ToolBarPanel,发送到转换器,如果值(ToolBarPanel.Children.Count)= FallbackValue则可能ToolBarPanel由于Button现在位于ToolBarOverflowPanel

,因此未注册为祖先
public class IsInOverflowPanel : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value?.ToString().Equals("-1");
    }
    /*ConvertBack(...) not included here*/
}

和XAML:

<ControlTemplate.Resources>
    <local:IsInOverflowPanel x:Key="MyOverflowDetector"/>
</ControlTemplate.Resources>

<ControlTemplate.Triggers>
    <DataTrigger Binding="{Binding Children.Count, Converter={StaticResource MyOverflowDetector}, RelativeSource={RelativeSource AncestorType=ToolBarPanel}, FallbackValue=-1}" Value="True">
        <!--Do Stuff Here-->
    </DataTrigger>
</ControlTemplate.Triggers>

此代码存在的问题是,当按钮进入ToolBarOverflowPanel时,它不会更新。

但它起初有效。我的结论是Children.Count没有提供更新通知。有办法解决吗?

如何强制转换器更新?我需要什么样的约束来实现它?

1 个答案:

答案 0 :(得分:0)

尝试使用此绑定:

<ControlTemplate.Resources>
    <local:IsOverflowPanelConverter x:Key="IsOverflowPanel" />
</ControlTemplate.Resources>
<ControlTemplate.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ToolBarOverflowPanel}}, Converter={StaticResource IsOverflowPanel}}" Value="True">

    </DataTrigger>
</ControlTemplate.Triggers>

和这个转换器

public class IsOverflowPanelConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value?.GetType() == typeof(ToolBarOverflowPanel);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我没有测试过,所以如果有任何问题请告诉我。