7

いくつかのカスタム セキュリティ設定に基づいて、ウィンドウの子コントロールを読み取り専用および無効に変更します。これを実現するために、ウィンドウの読み込み時に子コントロールをループします。

これはうまくいきます。99%完璧。

私のウィンドウには、コンテンツが ComboBox に基づいている ItemsControl があります。ComboBox を変更すると、ItemsControl の子コントロールが再びデータバインドされます。ただし、セキュリティ(読み取り専用/無効)はもはや当てはまりません。

ソリューションにジャンプする前に、ComboBox の変更イベントを処理できることはわかっています。しかし、私はそのようなボックスをたくさん持っており、開発者がウィンドウ/フォームに何を追加しても、ウィンドウレベル (ベースと考えてください) に適用できる一般的なソリューションはありません。

私の質問 (長いリードインで申し訳ありません) は、データバインディングなどの動的なアクティビティが原因で新しい子がウィンドウに追加されたことをどのように検出できますか? NewChildAdded イベントはありますか? DataBindingJustChangedThings イベントはありますか?

何かあるに違いない。

ソリューションにタイマーが含まれている場合は、返信する必要はありません。私のフォームは複雑すぎて、その余分な負荷を処理できません。また、ティック間の遅延は、セキュリティ上の問題として現実的すぎます。

あなたは考えているかもしれません.outer-containerを読み取り専用または無効にするだけです. しかし、これはエキスパンダー、複数行のテキストボックス、リストボックスなどに悪影響を及ぼします。このようなアプローチは、粒度が十分ではありません。もちろん、以前に反復を開始した場所です。

ソリューションにスタイルが含まれている場合は、コントロールごとにアプローチをオーバーライドする方法を含める必要があります。一部のコントロール (チェックボックスなど) は UI レイアウトに目的があるため、無効にすることはできません。

制約があり申し訳ありませんが、本番環境でソリューションを使用する予定です。

ありがとうございました。

4

2 に答える 2

21

OnVisualChildrenChangedを試しましたか?

    /// <summary>
    /// Handle visual children being added or removed
    /// </summary>
    /// <param name="visualAdded">Visual child added</param>
    /// <param name="visualRemoved">Visual child removed</param>
    protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
    {
        // Track when objects are added and removed
        if (visualAdded != null)
        {
            // Do stuff with the added object
        }
        if (visualRemoved != null)
        {
            // Do stuff with the removed object
        }

        // Call base function
        base.OnVisualChildrenChanged(visualAdded, visualRemoved);
    }
于 2011-05-16T23:14:41.780 に答える