1

我有一个第 3 方 SplitButton 控件,它公开了一些 DropDownContent 和一个布尔值 IsOpen dp 来控制是否显示下拉内容。

在 DropDownContent 是具有多个按钮的 StackPanel 的情况下,每个按钮都绑定到视图模型中的命令。除了执行该命令之外,单击按钮还需要关闭打开的 DropDown 内容,我正在使用下面的 AttachedBehavior 执行此操作。

但是我的绑定(简单地需要获取对祖先 SplitButton 控件的引用)不起作用。在绑定中,您会注意到我正在尝试查找 SplitButton 类型的第一个 Ancestor 控件。但是,我确实看到调试信息显示祖先级别 1,因此我将级别更改为高达 4,但仍然出现错误。

有人可以看到修复是什么吗?

绑定错误

System.Windows.Data 错误:4:找不到与引用“RelativeSource FindAncestor,AncestorType='Xceed.Wpf.Toolkit.SplitButton',AncestorLevel='1''的绑定源。BindingExpression:(无路径);数据项=空;目标元素是“CloseDropDownContentBehavior”(HashCode=8896066);目标属性是“DropDownButtonElement”(类型“SplitButton”)

xml

<DataTemplate x:Key="AddNewPartyTemplate">
    <StackPanel HorizontalAlignment="Right" Margin="10">

        <toolkit:SplitButton x:Name="theSplitButton" Content="{resx:Resx Subject_AddNewWithChoices}">
            <toolkit:SplitButton.DropDownContent>
                <StackPanel x:Name="theStackPanel">
                    <Button Content="{resx:Resx Person}" Command="{Binding AddNewPersonCommand}" 
                        >
                        <i:Interaction.Behaviors>
                            <local:CloseDropDownContentBehavior 
                  ***              DropDownButtonElement="{Binding 
                                    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type toolkit:SplitButton}}}"/>
                        </i:Interaction.Behaviors>
                    </Button>
                    ...

                </StackPanel>
            </toolkit:SplitButton.DropDownContent>
        </toolkit:SplitButton>
    </StackPanel>
</DataTemplate>

依附行为

public class CloseDropDownContentBehavior : Behavior<ButtonBase>
{
    private ButtonBase _button;

    protected override void OnAttached()
    {
        _button = AssociatedObject;
        _button.Click += OnPartyButtonClick;
    }

    protected override void OnDetaching()
    {
        _button.Click -= OnPartyButtonClick;
    }

    // **** the point of it all
    void OnPartyButtonClick(object sender, RoutedEventArgs e) { DropDownButtonElement.IsOpen = false; }

    public static readonly DependencyProperty DropDownButtonElementProperty =
        DependencyProperty.Register("DropDownButtonElement",
        typeof(SplitButton), typeof(CloseDropDownContentBehavior), new UIPropertyMetadata(null, OnDropDownElementChanged));

    public DropDownButton DropDownButtonElement
    {
        get { return (DropDownButton)GetValue(DropDownButtonElementProperty); }
        set { SetValue(DropDownButtonElementProperty, value); }
    }

    private static void OnDropDownElementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {

    }
}
4

2 回答 2

1

猜测是因为Interaction.Behaviors它不是可视树的一部分,所以绑定不会找到祖先。您是否简单地尝试过:

DropDownElement="{Binding ElementName=theSplitButton}"

评论更新:在这种情况下,解决方案是简单地使用x:Reference

DropDownElement="{x:Reference theSplitButton}"
于 2012-07-05T12:49:47.443 回答
0

我不知道 SplitButton.DropDownContent 但如果它的行为类似于上下文菜单,则以下答案可能会有所帮助:WPF 上下文菜单,其项目被定义为数据模板

这个技巧是与 RelativeSource Self 或 Type ContextMenu 绑定,然后将 Path 设置为 PlacementTarget.DataContext.YourProperty

于 2012-07-05T13:32:18.017 回答