使用 ElementName 将 XAML 元素绑定到 UserControl
Bind XAML element to UserControl using ElementName
我的页面中有以下 XAML 元素的场景和层次结构:
<Page> ....
<StackPanel> ...
<Grid> ....
<StackPanel>
<uc:MyUserControl
ReferencedButton={Binding ElementName=RightButton} />
<Button x:Name="RightButton" Click="{x:Bind ViewModel.OpenFlyout}" Content="Clickme" />
</StackPanel>
......
然后后面的代码来自'MyUserControl'
public UIElement ReferencedButton
{
get { return (UIElement)GetValue(ReferencedButtonProperty); }
set { SetValue(ReferencedButtonProperty, value); }
}
public static readonly DependencyProperty ReferencedButtonProperty =
DependencyProperty.Register(nameof(ReferencedButton), typeof(UIElement), typeof(MyUserControl), null);
到目前为止一切顺利,但我期望在我后面的代码中,'ReferencedButton' 属性 将填充对 'RightButton' 按钮的引用。但是它总是 returns null.
我什至尝试过:
{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, ElementName=RightButton}
我知道可以绑定元素,因为我从 DevExpress 组件中获得了示例,但仍然没有成功。
我正在关注以下文档中的 suggestions/rules:
p.s:我知道我可以在后面的代码中传递对按钮的引用,但是我想通过 XAML 本身来完成。
事实证明,我需要使用 PropertyChangedCallback
才能使其正常工作。所以解决方法如下:
public static readonly DependencyProperty ReferencedButtonProperty=
DependencyProperty.Register(nameof(ReferencedButton),
typeof(UIElement),
typeof(MyUserControl),
new PropertyMetadata(default(UIElement),
new PropertyChangedCallback(PlacementCallBack)));
在我的控件后面的代码中,我可以通过像这样实现 PlacementCallBack 来访问和设置值:
public static void PlacementCallBack(object sender, DependencyPropertyChangedEventArgs e)
{
var myuserControl = sender as MyUserControl;
myuserControl.ReferencedButton = e.NewValue as UIElement;
}
对象 DependencyPropertyChangedEventArgs
包含两个属性 NewValue 和 OldValue,它们保存了先前对象集的旧值和新值。
我的页面中有以下 XAML 元素的场景和层次结构:
<Page> ....
<StackPanel> ...
<Grid> ....
<StackPanel>
<uc:MyUserControl
ReferencedButton={Binding ElementName=RightButton} />
<Button x:Name="RightButton" Click="{x:Bind ViewModel.OpenFlyout}" Content="Clickme" />
</StackPanel>
......
然后后面的代码来自'MyUserControl'
public UIElement ReferencedButton
{
get { return (UIElement)GetValue(ReferencedButtonProperty); }
set { SetValue(ReferencedButtonProperty, value); }
}
public static readonly DependencyProperty ReferencedButtonProperty =
DependencyProperty.Register(nameof(ReferencedButton), typeof(UIElement), typeof(MyUserControl), null);
到目前为止一切顺利,但我期望在我后面的代码中,'ReferencedButton' 属性 将填充对 'RightButton' 按钮的引用。但是它总是 returns null.
我什至尝试过:
{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, ElementName=RightButton}
我知道可以绑定元素,因为我从 DevExpress 组件中获得了示例,但仍然没有成功。
我正在关注以下文档中的 suggestions/rules:
p.s:我知道我可以在后面的代码中传递对按钮的引用,但是我想通过 XAML 本身来完成。
事实证明,我需要使用 PropertyChangedCallback
才能使其正常工作。所以解决方法如下:
public static readonly DependencyProperty ReferencedButtonProperty=
DependencyProperty.Register(nameof(ReferencedButton),
typeof(UIElement),
typeof(MyUserControl),
new PropertyMetadata(default(UIElement),
new PropertyChangedCallback(PlacementCallBack)));
在我的控件后面的代码中,我可以通过像这样实现 PlacementCallBack 来访问和设置值:
public static void PlacementCallBack(object sender, DependencyPropertyChangedEventArgs e)
{
var myuserControl = sender as MyUserControl;
myuserControl.ReferencedButton = e.NewValue as UIElement;
}
对象 DependencyPropertyChangedEventArgs
包含两个属性 NewValue 和 OldValue,它们保存了先前对象集的旧值和新值。