Ссылка на элемент управления из родительского окна в пользовательском элементе управления - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь создать многоразовый всплывающий пользовательский элемент управления.Это должен быть пользовательский контроль, потому что он должен содержать кнопку и гиперссылку, которая будет нуждаться в коде позади при нажатии.Я хочу установить PlacementTarget всплывающего окна на элемент управления (например, кнопку) в родительском окне и хотел бы иметь возможность передать имя элемента управления, чтобы всплывающее окно открывалось рядом с соответствующим элементом управления.Я пробовал следующее, но оно не работает.

Контроль пользователя:

<UserControl
  x:Class="SampleTestProject.WPF.VrtContactUserTooltip"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Name="parent">
  <Grid>
    <Popup
    Name="ContactTooltip"
    PlacementTarget="{Binding Path=Target, ElementName=parent}"
    DataContext="{Binding Path=Contact}"/>
    </Grid>
</UserControl>

Код для управления пользователем:

 public partial class VrtContactUserTooltip : UserControl
  {
public VrtContactUserTooltip()
{
  InitializeComponent();
}

#region Properties

#region Target

/// <summary>
/// Gets or sets the Target of the tooltip
/// </summary>
public string Target
{
  get { return (string)GetValue(TargetProperty); }
  set { SetValue(TargetProperty, value); }
}

/// <summary>
/// Identified the Target dependency property
/// </summary>
public static readonly DependencyProperty TargetProperty =
  DependencyProperty.Register("Target", typeof(string),
    typeof(VrtContactUserTooltip), new PropertyMetadata(""));

#endregion

#region Contact

/// <summary>
/// Gets or sets the Contact of the tooltip
/// </summary>
public Contact Contact
{
  get { return (Contact)GetValue(ContactProperty); }
  set { SetValue(ContactProperty, value); }
}

/// <summary>
/// Identified the Contact dependency property
/// </summary>
public static readonly DependencyProperty ContactProperty =
  DependencyProperty.Register("Contact", typeof(Contact),
    typeof(VrtContactUserTooltip), new PropertyMetadata(null));

#endregion
#endregion
  }
}

Где находится контроль пользователяused:

 <Button
    x:Name="PopupButton3" />
  <wpf:VrtContactUserTooltip
    Target="{Binding Source={x:Reference PopupButton3}}"
    Contact="{Binding Path=Contact}"/>

Возможно ли это сделать (т.е. передать имя элемента управления из родительского элемента управления в пользовательский элемент управления и связать его с ним)?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

В итоге я установил PlacementTarget в конструкторе окна, в котором использовался пользовательский элемент управления. Я поместил следующую строку в конструктор родительского окна:

ContactPopup3.ContactTooltip.PlacementTarget = PopupButton3;

Это не идеально (так как его нужно будет устанавливать в коде каждый раз, когда пользовательский элемент управления используется), но это решило проблему.

0 голосов
/ 26 августа 2018

См .: https://stackoverflow.com/a/1127964/1462330

Я думаю, что вы также можете вместо того, чтобы делать предка поиска, просто явно передать родительский элемент управления / окно в качестве контекста данных для дочернего элемента управления и связать его с ним.

Дизайн мудрый: это зависит от того, насколько вероятно, что вы повторно используете элемент управления.Является ли дочерний пользовательский элемент управления чем-то, что будет снова и снова использоваться в обычном сценарии?Если это так, это может быть возможно сделать в XAML, но способ, которым я бы это обработал, заключался бы в определении интерфейса, который элемент управления ожидает реализовать в родительском элементе, и конструктора, который принимает что-то, реализующее этот интерфейс, в качестве параметра.На стороне C # я бы преобразовал родительское свойство в «IHaveWhatINeed», где мне нужно использовать свойства родительских элементов управления.Это сделало бы связь между родительским и дочерним элементами управления явной и изолировало бы связь с определенным подмножеством свойств / функций, на которые дочерний элемент опирается от родителя.

private IWhatINeed data;
public ChildControl( IWhatINeed requiredData )
{ ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...