#wpf #binding #imultivalueconverter
#wpf #привязка #imultivalueconverter
Вопрос:
У меня проблема с MultiValueConverter, которая все больше и больше похожа на ошибку .NET, чем больше я пытаюсь ее исправить. Вот в чем дело:
Я привязываю свойство IsEnabled как для Stackpanel, так и для пользовательского элемента управления (UC), используя аналогичное определение многозначности (конечно, я использую <ns:usercontrolname.IsEnabled>
для UC):
<StackPanel.IsEnabled>
<MultiBinding Converter="{StaticResource InfoSectionIsEnabled}">
<Binding Path="IsInactive" />
<Binding Path="IsWaitingForMicro" />
</MultiBinding>
</StackPanel.IsEnabled>
«Текущий» UC (тот, который содержит этот XAML) присваивается элементу TabItem.Содержание. DataContext задается в элементе TabItem.
Я также использую приведенные выше свойства в двух отдельных привязках с одним значением в одном и том же «текущем» UC:
<scps:ucSOIA x:Name="ucSOIA" IsEnabled="{Binding Path=IsWaitingForMicro, Converter={StaticResource InvertBool}}"/>
и
<scps:ucMisc x:Name="ucMisc" IsEnabled="{Binding Path=IsInactive, Converter={StaticResource InvertBool}}"/>
Все привязки работают нормально, когда «текущий» UC создается первым экземпляром и присваивается содержимому TabItem. Но как только я меняю содержимое TabItem на другой UC (без удаления созданного экземпляра ‘current’ UC), все преобразователи вызываются снова, и values()
параметр MultiValueConverter содержит NamedObject
оба значения целиком. Преобразователи с одним значением, использующие точно такие же свойства, работают нормально.
Я не могу этого понять. Я даже пытался использовать RelativeSource для многозначных привязок, но безрезультатно.
У меня есть два вопроса:
-
Какими могут быть значения в многозначном преобразователе
NamedObject
, когда привязки с одним значением работают нормально -
Менее важный вопрос заключается в том, почему вызываются привязки при изменении содержимого TabItem (обратите внимание, эти преобразователи вызываются до UserControl.Выгружено)
Спасибо, Дэйв
Комментарии:
1. Я получаю аналогичную проблему. Моя многозначность выдает исключение во время разработки (преобразование из типа ‘NamedObject’ в тип ‘Boolean’ недопустимо.). Если я прокомментирую многозначность, но продолжу использовать эти привязки (отдельно) для двух других элементов управления, все это сработает. Кажется, это как-то связано с многозначностью?
Ответ №1:
По крайней мере, до некоторой степени, это удалось. Вам нужно быть более надежным с вашим многозначным преобразователем (информация включена).
В моем случае мой преобразователь был следующим:
Public Function Convert(values() As Object,
targetType As System.Type,
parameter As Object,
culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
If values IsNot Nothing Then
Return values.All(Function(n) CBool(n))
End If
Return False
End Function
Затем я заметил в другом сообщении (извините, уже потерял ссылку), что во время разработки, поскольку IDE не может вычислить правильные значения для передачи конвертеру, он передает ‘NamedObject’ для каждой из привязок.
В моем случае меня интересовали только логические значения, поэтому я изменил свой код, чтобы конкретно обрабатывать только эти случаи (тем самым предотвращая случайную попытку преобразовать NamedObjects в boolean):
Public Function Convert(values() As Object,
targetType As System.Type,
parameter As Object,
culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
If values IsNot Nothing AndAlso values.All(Function(n) TypeOf n Is Boolean) Then
Return values.All(Function(n) CBool(n))
End If
Return False
End Function
Это немедленно решило проблему для меня.
Комментарии:
1. Боже, я чувствую себя неловко … лол. Я даже не подумал добавить проверку в мой конвертер. Спасибо за вашу помощь! Но это все еще не объясняет, почему многозначная привязка не выполняется таким образом, в то время как преобразователи с одним значением работают отлично.
2. По крайней мере, вы были не единственным 😉