Привязать элемент XAML к UserControl, используя ElementName - PullRequest
0 голосов
/ 26 апреля 2019

На моей странице следующий сценарий и иерархия элементов 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'. Однако он всегда возвращает ноль.

Я даже попробовал:

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

Я знаю, что можно связать элемент , потому что я получил пример от компонента DevExpress, но все еще безуспешно.

Я следую советам / правилам из следующих документов:

Связующее имя элемента

XAML Namescopes

p.s: Я знаю, что могу передать ссылку на кнопку в своем коде, однако я бы хотел сделать это через сам XAML.

1 Ответ

1 голос
/ 26 апреля 2019

Оказывается, мне нужно было использовать 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, они содержат старые и новые значения предыдущего набора объектов.

...