我有一个第 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) {
}
}