0

データ テンプレートに 2 つのコントロールが含まれています。コントロール #1 は、「TXTBLOCK」と呼ばれる TextBlock です。コントロール #2 は、「TXTBOX」と呼ばれる TextBox です。

TXTBLOCK では、Visibility がコンバーターを使用して TextBox Visibility に設定され、反対の値が得られます。

例:

<TextBlock Name="TXTBLOCK" Visibility="{Binding ElementName=**TXTBOX**, Path=Visibility, Converter={StaticResource toggleVisConverter}}" />

<TextBox Name="TXTBOX" Visibility="{Binding ElementName=**TXTBLOCK**, Path=Visibility, Converter={StaticResource toggleVisConverter}}" />

コンバーターは次のとおりです。

        if (targetType == typeof(Visibility))
        {
            Visibility vis = (Visibility)value;
            if (vis == Visibility.Collapsed)
            {
                return Visibility.Visible;
            }
            else
            {
                return Visibility.Collapsed;
            }
            //var vis == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
        }

        //return vis;
        throw new InvalidOperationException("Value must be of type 'Visibility'.");

今...私にとって、これは簡単なはずです。一方の可視性を変更すると、他方の可視性が false に設定されます。

そうではありません...

初めて動作し、コンバーターの呼び出しが停止します。

コードビハインドで「TXTBOX.Visibility = Visibility.Hidden」と明示的に述べても、コンバーターが呼び出されることはありません。

何を与える?私は何が欠けていますか?

これは SO に関する私の最初の投稿です。喜んでやります

ありがとう!

4

1 に答える 1

0

WPF には、データ バインディングでスタック オーバーフローを検出して回避する方法があるようです。 私は 1 つを認識していますが、別の を見つけたようです。

コントロールの 1 つの可視性を変更すると、次のようなことが起こります (少なくとも理論上は)。

  • TextBlock の可視性を変更すると (たとえば)、
  • これにより、TextBox の可視性が変化します。
  • これにより、TextBlock の可視性がさらに変化します。
  • これにより、最初のバインディングを再度使用して、TextBlock の可視性がさらに変化します。
  • ...

このような状況を自動的に検出する WPF がなければ、これは永遠に続き、おそらくスタック オーバーフローを引き起こします。この場合、スタック オーバーフローに向かっている可能性があることを検出すると、作成したバインディングのリッスンを停止するようです。

私はあなたのコードを実行していませんが、WPF もこれについて通知していないと思います。例外も警告もなく、出力ウィンドウにデバッグ行も書き込まれていないと思います。

ここではバインディングのペアが問題のようです。私がお勧めすることは次のとおりです。

  • メソッドを実装して、ValueConverter を双方向コンバーターにしますConvertBackCollapsed(コンバーターが行っているのがとの間の交換だけである場合はVisibleConvertBackおそらく を呼び出すことができますConvert。)
  • バインディングの 1 つ (どちらでも構いません) を追加して双方向にし、もう 1 つのバインディングMode=TwoWayを削除します。バインディングは、2 つのTwoWayコントロール間の双方向の通信に十分です。

編集:私のコメントConvertBackは、次のように実装できるということでした:

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    return Convert(value, targetType, parameter, culture);
}

これは、コンバーターが行っているのは と の間の交換だけでVisibleありCollapsed、一方の方法を変換することは元に戻すことと同じであるためです。このコメントは本質的に余談でした。もちろん、必要に応じて実装できますが、バインディングでコンバーターを使用している場合はConvertBack実装する必要があります。ConvertBackTwoWay

于 2012-08-28T22:09:53.890 に答える