1

我有一个 MultiValueConverter 的问题,我越是尝试修复它,它就越感觉像一个 .NET 错误。这是怎么回事:

我正在使用类似的 MultiBinding 定义绑定 Stackpanel 和用户控件 (UC) 的 IsEnabled 属性(当然,我使用<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),就会再次调用所有转换器,并且 MultiValueConverter 的values()参数包含NamedObject两个整体。使用完全相同的属性的单值转换器工作正常。

我想不通。我什至尝试在 MultiBindings 上使用 RelativeSource,但无济于事。

我有两个问题:

  1. NamedObject当单值绑定正常工作时,MultiBindingConverter 中的值如何

  2. 不太重要的问题是为什么在我更改 TabItem 的内容时调用绑定(请注意,这些转换器是在 UserControl.Unloaded 之前调用的)

谢谢,戴夫

4

1 回答 1

3

至少在一定程度上解决了它。您需要更强大的多绑定转换器 (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

这立即为我解决了这个问题。

于 2011-06-06T12:46:01.980 回答