Привязка вложенного свойства WPF не работает, если родительское свойство имеет значение null - PullRequest
0 голосов
/ 15 октября 2019

У меня следующая ситуация:

<DatePicker IsEnabled="{Binding ParentObject.EditAvailable}"

Теперь, если я установлю ParentObject на null в моей ViewModel, которая также является DataContext IsEnabled свойством на DatePickerбыть установленным на true

Привязка работает полностью корректно для всех случаев, если ParentObject установлен правильно.

Но я не совсем понимаю такое поведение в WPF.

В качестве обходного пути можно использовать:

<DatePicker IsEnabled="{Binding ParentObject.EditAvailable, FallbackValue=False}"

Так что теперь, если ParentObject установлен в null через мою ViewModel, свойство IsEnabled в DatePicker возвращает false.

Могу ли я что-либо сделать, не установив FallbackValue на каждом из моих элементов управления в моем проекте? Он уже огромен, и мне нужно найти решение, чтобы оно каким-то образом использовалось в качестве поведения по умолчанию: если ParentObject равно нулю, то есть значение по умолчанию, установленное по умолчанию (bool), по умолчанию (строка) и т. Д. И т. Д.

Любая помощь очень ценится.

Ответы [ 3 ]

2 голосов
/ 15 октября 2019

Вы можете установить IsEnabled на панели или сетке, содержащей элементы управления, и это повлияет на все содержащиеся в ней элементы управления.

<StackPanel IsEnabled="{Binding ParentObject.EditAvailable, FallbackValue=False}">
    <DatePicker />
    <DatePicker />
    <DatePicker />
</StackPanel>
1 голос
/ 15 октября 2019

Если путь привязки всегда один и тот же, вы можете использовать стиль по умолчанию для DatePicker:

<Style TargetType="DatePicker">
  <Setter Property="IsEnabled" Value="{Binding ParentObject.EditAvailable, FallbackValue=False}"/>
</Style>
1 голос
/ 15 октября 2019

Могу ли я что-либо сделать, не устанавливая FallbackValue для каждого из моих элементов управления в моем проекте?

Нет, не считая замены каждой привязки на пользовательскую, которая устанавливает FallbackValue по умолчанию. См. этот ответ для примера.

Вам все равно придется заменить {Binding на {local:YourBinding везде.

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