Доступ к себе в событии изменения прикрепленного свойства

Допустим, у меня есть элемент управления 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 виден. Если вы щелкнете по нему, откроется окно справки, в котором будет указано только имя темы, никакой другой информации не потребуется.

Не могли бы вы добавить более конкретные примеры? Более конкретный контекст?

Kissaki 24.06.2024 19:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала позвольте мне подвести итог моему пониманию проблемы. У вас есть элемент управления HelpButton с именем HB и у него есть свойство TopicName. Когда TopicName пусто, HB должно быть скрыто, в противном случае при нажатии должно открываться окно на основе TopicName (я предполагаю, что HelpButton обрабатывает всю эту логику внутри). Однако вы хотите, чтобы любой другой элемент мог устанавливать HBTopicName без необходимости ссылки на сам 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 (а может и нет), привязка к модели резервного представления здесь, которая будет служить общим состоянием, будет намного проще, чем попытка заставить элементы управления напрямую манипулировать друг другом. характеристики.

Другие вопросы по теме