0

XAMLにリストボックスがあるビューがあり、そのリストボックスで選択すると、ChildViewModelの選択したインスタンスのプロパティが横の領域に表示されます。ChildViewModelのコマンドに接続されているChildViewのボタンがいくつかあります。親リストボックスから選択する前に、これらのボタンは期待どおりに何もしません。親リストボックスで選択が行われるまでこれらのボタンを非表示にして、ChildViewModelのインスタンスを作成するにはどうすればよいですか。

これらのボタンの可視性を{BindingSelectedItem、ElementName = listBoxName}にバインドすることにより、これらのボタンが親ビューの一部である場合にこれを実現する方法を知っています。ただし、親ビューから要素にアクセスできない(依存したくない)ため、ChildView内でこれを実行するのに苦労しています。できれば純粋にXAMLコード内でこれを達成するのを手伝ってください。

4

3 に答える 3

2

子ビューのデータコンテキストが null (つまり、ChildViewModel が設定されていない) かどうかを確認するだけでよいはずです。null の場合、ボタンを非表示にします。

<Button Click="Button_Click" Content="bah">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}, Path=DataContext}" Value="{x:Null}" >
                        <Setter Property="Visibility" Value="Collapsed"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

先祖を、子ビューを保持しているコンテナに設定します

于 2012-07-26T05:06:58.670 に答える
0

これに取り組む 1 つの方法は、ViewModel のプロパティとバインディングに基づいてシグナリングを行い、ValueConverter で可視性を管理することです。

親ビューとビュー モデルを指定すると、独自のビュー モデルを持つ子ビューがあり、親の VM が子 VM を担当します。

親ビュー モデル: リストボックスの SelectedItem がバインドされる "SelectedItem" プロパティ (コンテキストに適した名前) が含まれています。Setter 内で、子の VM にブール値のプロパティを設定します。(つまり、ParentItemSelected) Child のコントロールの Visibility プロパティは、ブール値を適切な Visibility 値に変換する値コンバーターを使用して ParentItemSelected にバインドされます。

親ビューと子ビューが VM を共有している場合、同じことが機能しますが、「SelectedItem」が null であるかどうかに基づいて可視性が異なります。(または、同様のブール プロパティを使用できます。)

于 2012-07-26T01:10:12.137 に答える
0

EdFred が提案したように、MVVMLight とその Messenger 機能を使用して、依存オブジェクト間の通信を切り離すことができます。これを行う方法の例を次に示します。

MVVM フレームワークを使用していない場合でも、子ビュー モデルからサブスクライブできる親でイベントを公開できます。親で選択が変更されると、子ビューモデルで実行したいアクションを実行できます。

于 2012-07-26T04:16:30.493 に答える