Пользовательское свойство зависит от других свойств - PullRequest
0 голосов
/ 07 июня 2011

Предварительные извинения за объяснения в стиле событий;Есть много факторов, которые, я чувствую, играют свою роль.WPF - не мой любимый фреймворк, и это, вероятно, показывает.:)

Старая ситуация: у меня было окно с несколькими элементами управления.В зависимости от их выбора, я использовал мультибиндинги и конвертер, чтобы определить, нужно ли показывать определенные элементы управления, которые информируют пользователя о последствиях их изменений, прежде чем они в конечном итоге подтвердят их с помощью OK (или просто отклонят с помощью Отмена).Это сработало идеально.

Проблема: Слишком много элементов управления со временем, слишком много помех.Решение: Поместите материал в разные страницы, чтобы пользователю было легче просматривать.Чтобы изменения сохранялись при произвольном просмотре пользователем страниц между страницами, я создаю их динамически и помещаю в кеш (Dictionary<string, BasePage>, см. Ниже), из которого они будут извлекаться по мере их выбора пользователем.

Следствие. Мне нужно отделить привязки от элементов управления уведомлениями, так как различные параметры теперь находятся на разных страницах.

Решение?Я поместил класс BasePage, который предоставляет некоторые абстрактные свойства, доступные только для чтения, которые определяют различные аспекты, о которых нужно знать окну для выполнения его уведомлений.Например, свойство bool requiresReboot определяет, требует ли текущее состояние на этой странице перезагрузка для получения (полного) эффекта.Определенная страница реализует свойство на основе своих элементов управления.Проблема: я не знаю, как сохранить правильную привязку, которая корректно обновляется при изменении страниц.Я попытался дать своему элементу управления уведомлением привязку к Dictionary<string, BasePage> с помощью конвертера, который проверяет все страницы и соответствующее свойство.

Вопросы:

1) Как создать для этого подходящее свойствоцель?Я предполагаю, что мне нужен DependancyProperty, так как я немного прочитал MSDN, но не могу понять, как это сочетается.2) Как сделать ссылку между моим настраиваемым свойством, чтобы она позволяла (нескольким) элементам управления на странице изменять это свойство?Я использую INotifyPropertyChanged как-то?Мой старый пример связан с несколькими CheckBox.IsChecked свойствами в XAML.Я стараюсь не помещать тонны событий (OnChange и т. Д.) В элементы управления, поскольку исходный код не нуждался в этом, и мне сказали, что это создает грязное решение для WPF.3) Наконец, я подозреваю, что мне может понадобиться изменить класс Dictionary<string, BasePage> на пользовательскую реализацию, которая реализует какой-то INotifyPropertyChanged, но для коллекций?Я считаю, что «Наблюдаемая коллекция» - это термин, который я ищу.

Я надеюсь, что кто-то сможет преодолеть разрыв в моем понимании внутренних элементов WPF (собственности);Я был бы очень признателен.Базовая выборка была бы еще лучше, но если она слишком сложная, подойдет только толчок в правильном направлении.Спасибо.:)

1 Ответ

1 голос
/ 22 июня 2011

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

  1. В итоге я сделал рассматриваемое свойство неабстрактным DependencyProperty в базовом классе;это был единственный способ, которым я мог должным образом делегировать уведомления об изменениях интерфейсу.Производные классы просто заканчивали тем, что связывали его со своими элементами управления (с правильным Converter в случае, если требовалась дополнительная логика).

  2. Поскольку Dictionary<string, BasePage> не поддерживает какие-либо уведомления об измененияхЯ создал дополнительную коллекцию ObservableCollection<BasePage>, которую использовал для привязки.

  3. Однако такая коллекция не передает событие изменения, когда элементы внутри него имеют измененное свойство.Поскольку эта ситуация требовала этого, и я связывался с самой коллекцией в контексте свойства, которое не имеет отношения Master <-> Detail, такого как DataGrid (которое в основном добавляет свои собственные обработчики OnPropertyChanged к объекту с привязкой), Я закончил подклассом VeryObservableCollecton<>.Он слушает свои собственные элементы и генерирует правильное событие изменения (я думаю, это был OnPropertyChanged из интерфейса INotifyPropertyChanged), чтобы привязка (или в данном случае мульти-привязка) обновлялась правильно и позволяла моемуинтерфейс для обновления.

Это едва ли не самый красивый код, и он выглядит чрезмерно сложным, но, по крайней мере, он позволяет мне правильно привязать пользовательский интерфейс к данным таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...