WPF 3.5: Значения MultiValueConverter - это NamedObjects, где одиночные ValueConverter работают как обычно - PullRequest
1 голос
/ 03 июня 2011

У меня проблема с MultiValueConverter, который все больше и больше напоминает ошибку .NET, чем больше я пытаюсь ее исправить.Вот что случилось:

Я связываю свойство IsEnabled как Stackpanel, так и User Control (UC), используя аналогичное определение MultiBinding (конечно, я использую <ns:usercontrolname.IsEnabled> для UC):

<StackPanel.IsEnabled>
    <MultiBinding Converter="{StaticResource InfoSectionIsEnabled}">
        <Binding Path="IsInactive" />
        <Binding Path="IsWaitingForMicro" />
    </MultiBinding>
</StackPanel.IsEnabled>

'Текущий' UC (тот, который содержит этот XAML) назначается для TabItem.Content.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 (без избавления от экземпляра «текущего» UC), все преобразователи вызываются снова, и параметр values() MultiValueConverter содержит NamedObject для обоих входов.Преобразователи с одним значением, использующие те же свойства, работают нормально.

Я не могу понять это.Я даже пытался использовать RelativeSource для MultiBindings, но безрезультатно.

У меня есть два вопроса:

  1. Как значения в MultiBindingConverter могут быть NamedObject когда привязки с одним значением работают нормально

  2. Менее важный вопрос заключается в том, почему привязки вызываются при изменении содержимого элемента TabItem (обратите внимание, что эти преобразователи вызываются до UserControl.Unloaded)

Спасибо, Дейв

1 Ответ

3 голосов
/ 06 июня 2011

Разобрались, по крайней мере, до такой степени.Вам нужно быть более надежным с вашим конвертером мультисвязывания (InfoSectionIsEnabled).

В моем случае мой конвертер был следующим:

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 к логическому значению):

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

Это сразу решило проблему для меня.

...