1

修正しようとすればするほど、.NET のバグのように感じられる MultiValueConverter に問題があります。ここに何が起きているかです:

同様の 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 の 2 つの個別の単一値バインディングで上記のプロパティを使用しています。

<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 を使用してみましたが、役に立ちませんでした。

2 つの質問があります。

  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」を渡すことを発見しました。

私の場合、ブール値のみに関心があったため、コードを変更して、これらのケースのみを具体的に処理するようにしました (これにより、誤って NamedObject をブール値にキャストしようとするのを防ぎます)。

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 に答える