4

実行時に子要素を完全に制御するWPF要素を作成したいのですが、プロパティが変更されたときに子UIを追加および削除します。ItemsSourceプロパティを変更したときにItemsControlが行うことと少し似ていますが、私の場合は子が1つだけです。

これはMVVMのビューコンテナになります。モデルまたはViewModelを指定すると、魔法のように正しいビューが作成され、すべてが接続されます。ビューコンテナがテンプレート化可能である必要はありません(UserControlであり、独自のテンプレートを持つユーザー定義のビューを作成するため)。可能な限りカプセル化することをお勧めします。グリッドのようなものから派生し、自分のプロパティが変更されたときに子コントロールを追加することで、おそらくこれを簡単に行うことができます。ただし、Gridは子要素のコレクションを公開し、誰でも追加および削除できるようにします。

カプセル化を最大化するには、どのWPFクラスから派生する必要がありますか?また、実行時に子要素を追加するにはどうすればよいですか?

ドキュメントの理解に基づいて、実行時に子コントロールを作成できるかどうかを確認するために、FrameworkElementとAddVisualChildを使用してみました。AddLogicalChildが必要かどうかはわかりませんが、念のために入れておきます。

public class ViewContainer : FrameworkElement {
    private TextBlock _child;

    public ViewContainer() {
        _child = new TextBlock { Text = "ViewContainer" };
        AddLogicalChild(_child);
        AddVisualChild(_child);
        InvalidateMeasure();
    }

    public object Content { get; set; }

    protected override Size ArrangeOverride(Size finalSize) {
        _child.Arrange(new Rect(finalSize));
        return finalSize;
    }
    protected override Size MeasureOverride(Size availableSize) {
        _child.Measure(availableSize);
        return _child.DesiredSize;
    }
}

ViewContainerをウィンドウに入れて実行すると、「ViewContainer」というTextBlockが表示されるはずです。しかし、代わりに、空白のウィンドウが表示されます。だから明らかに私は何かが欠けています。

上記のコードを修正して、「子」コントロールが実行時に表示されるが、他の人が混乱することのないようにするにはどうすればよいですか(回避できる以上のこと)?

4

2 に答える 2

6

特定の質問に答えるには、 GetVisualChildプロパティとVisualChildrenCountプロパティをオーバーライドして、子要素を表示できるようにする必要もあります。

于 2010-06-23T15:50:03.657 に答える
0

WPFの暗黙的なDataTemplatesのサポートを利用することを考えましたか?

私があなたと同様の要件を処理した方法は、を使用することContentControlです。ContentプロパティをViewModelにバインドします。次に、ContentControlの上のツリーのどこかで参照されているリソースディクショナリで、Contentプロパティに割り当てられる可能性のあるすべてのタイプのViewModelに対してDataTemplatesが定義されていることを確認します。

このようにして、WPFはViewModelの正しいビューの配線を処理します。

于 2010-06-23T15:36:12.437 に答える