使用ElementName将XAML元素绑定到UserControl

时间:2019-04-26 09:41:56

标签: c# uwp uwp-xaml

我的页面中具有以下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”按钮的引用。但是,它始终返回null。

我什至尝试:

{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, ElementName=RightButton}

我知道可以绑定元素,因为我是从DevExpress组件获得示例的,但仍然没有成功。

我正在遵循以下文档的建议/规则:

Binding ElementName

XAML Namescopes

p.s:我知道我可以在代码后面传递对按钮的引用,但是我想通过XAML本身做到这一点。

1 个答案:

答案 0 :(得分:1)

事实证明,我需要使用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,它们保存先前对象集的旧值和新值。