Использование Source и Path одновременно при Binding

142
29 ноября 2018, 08:20

Имеется конвертер, который принимает некоторый объект и проанализировав его свойства возвращает объект Visiability. Однако обновление должно срабатывать каждый раз, когда меняется некоторое свойство этого объекта. Приведу пример:

Visibility="{Binding Source=LoadingModelProcess, 
Path=LoadingModelProcess.InProgress,
Converter={StaticResource ProcessVisiabilityConverter}}">

Нужно следующее: Когда изменится значение поля bool InProgress в объекте LoadingModelProcess, в конвертер прилетел на обработку сам объект LoadingModelProcess. Как это реализовать?

Про MultiBinding знаю, но может есть какое-нибудь другое решение?

Данное решение не помогает:

            <TreeView.Visibility>
                <MultiBinding Converter="{StaticResource ProcessVisibilityConverter}">
                    <Binding Path="LoadingModelProcess" />
                    <Binding Path="LoadingModelProcess.InProgress" />
                </MultiBinding>
            </TreeView.Visibility>
Answer 1

Source у Binding есть всегда, и это не "выходное" значение, а "входное". Когда свойство не задано (равно null), то используется "значение по умолчанию" — текущий DataContext. Выходное значение у Binding одно, и порядок вычисления значения в Binding один:

  1. Source / RelativeSource / ElementName ("по умолчанию": DataContext)
  2. Path / XPath ("по умолчанию": .)
  3. Converter (по умолчанию: null)
  4. StringFormat / автоматический конвертер ("по умолчанию": null)

Source остаётся и выходным значением только тогда, когда все остальные преобразования в цепочке отсутствуют.

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

Минусом является то, что вам может понадобиться написать конвертер ProcessVisibilityMultiConverter, что несколько архитектурно неприятно. Самый простой альтернативный способ — реализовать IMultiConverter прямо в ProcessVisibilityConverter. Самый сложный, но мощный — сделать конвертер, который собирается из других конвертеров, чтобы можно было пробрасывать одно из значений MultiBinding в обычный конвертер.

READ ALSO
C# WPF Анимация отдельных точек Polygon

C# WPF Анимация отдельных точек Polygon

Всем приветЕсть элемент класса Polygon, у него есть 4 точки, две из которых необходимо анимированно переместить

188
Чтение файла xml на сервере

Чтение файла xml на сервере

Есть сервер на шаблоне web API (asp) (файл конфигурации json)Мне необходимо загрузить файл в формате xml на сервер и прочитать данные из него

195
Linq Expressions параметризация уже существующего Expression

Linq Expressions параметризация уже существующего Expression

Пытаюсь преобразовать один Expression<Func<double, double>> в другой, однако при попытке компиляции полученного выражения, появляется ошибка

162