Допустим, у меня есть элемент управления A
, к которому прикреплено свойство AP
. И элемент управления B
использует его как A.AP = "value"
.
Подпись события изменения прикрепленного свойства такая же, как свойство зависимости, только d
теперь является прикрепляемым элементом, т. е. B
. Как мне получить доступ к A
внутри измененного события?
Я хочу спрятать A
если AP == null
и многое другое
private static void OnApChanged
(DependencyObject d, DependencyPropertyChangedEventArgs e)
Обратите внимание: я знаю, что «обычно» использование присоединенного свойства заключается в установке чего-либо в прикрепляющем элементе управления, т. е. A
обычно манипулирует B
свойствами, чтобы чего-то достичь. Но это всего лишь один сценарий. Я работаю над другим сценарием, когда B
не знает о A
существовании - A
похоронен где-то в визуальном дереве (или может даже не быть там вообще), и мне нужно, чтобы B
на самом деле установил AP
в строку и A
должен уметь реагировать на изменения и работать со значением. Это действительно похоже на свойство зависимости (прикрепленные свойства которого очень похожи), но только без B
осознания A
.
В данный момент я пытаюсь сделать следующее: мне нужен пользовательский элемент управления HelpButton (HB
), на котором есть кнопка и свойство TopicName. Я хочу, чтобы это было у любых произвольных FrameworkElement
детей. Родитель не знает об этом и HB
не знает о родителе. Если установлено имя темы, HB виден. Если вы щелкнете по нему, откроется окно справки, в котором будет указано только имя темы, никакой другой информации не потребуется.
Сначала позвольте мне подвести итог моему пониманию проблемы. У вас есть элемент управления HelpButton
с именем HB
и у него есть свойство TopicName
. Когда TopicName
пусто, HB
должно быть скрыто, в противном случае при нажатии должно открываться окно на основе TopicName
(я предполагаю, что HelpButton
обрабатывает всю эту логику внутри). Однако вы хотите, чтобы любой другой элемент мог устанавливать HB
TopicName
без необходимости ссылки на сам HB
.
Похоже, то, что вы ищете, не очень подходит для прикрепленных свойств, поскольку прикрепленным свойствам по-прежнему требуется экземпляр целевого объекта, хотя экземпляр типа-владельца не задействован. Если мы сделаем HelpButton
типом-владельцем, это не сработает, потому что HelpButton
— это тот тип, свойство которого нам нужно изменить. Если мы сделаем что-то другое типом владельца, это также не сработает, потому что никто больше не имеет доступа к экземпляру HelpButton
по вашей проблеме. Поэтому прикрепленные свойства, я думаю, здесь неправильный путь.
Я бы сохранил HelpButton.TopicName
стандарт DependencyProperty
, принадлежащий HelpButton
(т. е. не присоединенное свойство). Тогда я думаю, что модель одноэлементного представления, к которой все элементы пользовательского интерфейса могут получить доступ/связаться с ней, служит функции, которую вы пытались реализовать через прикрепленное свойство. Вот грубый пример:
Посмотреть модель
public static class ViewModels
{
public static HelpViewModel HelpViewModel
{
get;
} = new HelpViewModel();
}
public class HelpViewModel : ViewModel
{
#region string HelpTopic property
private string _HelpTopic;
public string HelpTopic
{
get
{
return _HelpTopic;
}
set
{
if (_HelpTopic == value)
return;
_HelpTopic = value;
OnPropertyChanged();
}
}
#endregion
}
КСАМЛ:
<HelpButton x:Name = "HB" TopicName = "{Binding
Source = {x:Static local:ViewModels.HelpViewModel},
Path=HelpTopic}" />
Таким образом, любой может изменить ViewModels.HelpViewModel.HelpTopic
где угодно, без необходимости доступа к экземпляру HelpButton
.
Просто обратите внимание, что даже если вы не следуете строгому шаблону MVVM (а может и нет), привязка к модели резервного представления здесь, которая будет служить общим состоянием, будет намного проще, чем попытка заставить элементы управления напрямую манипулировать друг другом. характеристики.
Не могли бы вы добавить более конкретные примеры? Более конкретный контекст?