我正在使用Extended WPF Toolkit中的DropDownButton控件。在其中,我正在托管一个ListBox,在更改所选元素时,应该隐藏包含DropDownButton。
我与微软互动框架结合使用的最初方法是:
<xctk:DropDownButton x:Name="WorkspaceSelectorContainer" Content="This is the active workspace">
<xctk:DropDownButton.DropDownContent>
<ListBox ItemsSource="{Binding workspaces}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<ie:ChangePropertyAction PropertyName="IsOpen" Value="False" TargetObject="{Binding ElementName=WorkspaceSelectorContainer}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
</StackPanel>
</xctk:DropDownButton.DropDownContent>
</xctk:DropDownButton>
但这不起作用,因为找不到WorkspaceSelectorContainer。 我没有使用ElementName进行绑定,而是尝试找到DropDownButton类型的祖先,但这也不起作用;跟踪绑定显示它只解析了祖先直到DropDownButton.DropDownContent的最外层元素,但没有进一步;例如DropDownButton本身不是祖先树的一部分。
好的,我的下一个方法是
<ie:ChangePropertyAction PropertyName="IsOpen" Value="False" TargetObject="{Binding Source={x:Reference WorkspaceSelectorContainer}}"/>
但是这不起作用,因为它抛出了异常
A first chance exception of type 'System.Xaml.XamlObjectWriterException' occurred in System.Xaml.dll
Additional information: Cannot call MarkupExtension.ProvideValue because of a cyclical dependency. Properties inside a MarkupExtension cannot reference objects that reference the result of the MarkupExtension.
不知道还有什么可以尝试。有谁知道如何解决这个问题?
是否有可能以某种方式引用包含所有内容的根网格,并从那里搜索DropDownButton元素? 像{Binding Source = {x:Reference MyRootGrid},ElementName = WorkspaceSelectorContainer}之类的东西(这不起作用,因为我无法组合source和ElementName)
谢谢!
答案 0 :(得分:3)
我遇到了同样的问题(虽然在Silverlight中)。 通过引入一个资源对象来解决它,该资源对象具有对DropDownButton的引用,并且可以很容易地从DropDownContent中绑定:
<Foo.Resources>
<BindableObjectReference
x:Key="WorkspaceSelectorContainerReference"
Object="{Binding ElementName=WorkspaceSelectorContainer}"/>
</Foo.Resources>
<DropDownButton x:Name="WorkspaceSelectorContainer" ...>
<DropDownButton.DropDownContent>
...
<ChangePropertyAction
PropertyName="IsOpen"
Value="False"
TargetObject="{Binding Path=Object,
Source={StaticResource WorkspaceSelectorContainerReference}}"/>
...
</DropDownButton.DropDownContent>
</DropDownButton>
......和魔法物品
public class BindableObjectReference : DependencyObject
{
public object Object
{
get { return GetValue( ObjectProperty ); }
set { SetValue( ObjectProperty, value ); }
}
public static readonly DependencyProperty ObjectProperty =
DependencyProperty.Register( "Object", typeof( object ),
typeof( BindableObjectReference ), new PropertyMetadata( null ) );
}
答案 1 :(得分:0)
<ie:ChangePropertyAction PropertyName="IsOpen" Value="False"
TargetName="WorkspaceSelectorContainer" />