3

次のように、マスター詳細を実装したデータグリッドがあります。

<data:DataGrid x:Name="dgData"  Width="600" ItemsSource="{Binding Path=ItemCollection}"
                       HorizontalScrollBarVisibility="Hidden" CanUserSortColumns="False" RowDetailsVisibilityChanged="dgData_RowDetailsVisibilityChanged">
                    <data:DataGrid.Columns>
                        <data:DataGridTextColumn Header="Item" Width="*" Binding="{Binding Item,Mode=TwoWay}"/>
                        <data:DataGridTextColumn Header="Company" Width="*" Binding="{Binding Company,Mode=TwoWay}"/>

                    </data:DataGrid.Columns>
                    <data:DataGrid.RowDetailsTemplate>
                        <DataTemplate>
                            <data:DataGrid x:Name="dgrdRowDetail" Width="400" AutoGenerateColumns="False" HorizontalAlignment="Center" 
                                       HorizontalScrollBarVisibility="Hidden" Grid.Row="1">
                                <data:DataGrid.Columns>
                                    <data:DataGridTextColumn Header="Date" Width="*" Binding="{Binding Date,Mode=TwoWay}"/>
                                    <data:DataGridTextColumn Header="Price" Width="*" Binding="{Binding Price, Mode=TwoWay}"/>
                                    <data:DataGridTemplateColumn>
                                        <data:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <Button Content="Show More Details" Click="buttonShowDetail_Click"></Button>
                                            </DataTemplate>
                                        </data:DataGridTemplateColumn.CellTemplate>
                                    </data:DataGridTemplateColumn>
                                </data:DataGrid.Columns>
                            </data:DataGrid>
                        </DataTemplate>
                    </data:DataGrid.RowDetailsTemplate>
                </data:DataGrid>

製品の詳細を表示するボタンをクリックして、子ウィンドウを開きたいです。

MVVMパターンを使用しています。My Modelには、Item名を入力として受け取り、Detailsデータを返すメソッドが含まれています。

私の問題は、モデルから詳細データを取得するViewModelにアイテムをどのように渡す必要があるかです。そして、どこで新しい子ウィンドウを開く必要がありますか?ViewまたはViewModelで?

4

2 に答える 2

5

ビューモデルから子ウィンドウを開くと、パターンが想定されているビューモデルとビューモデルの分離に違反します。したがって、子ウィンドウをどこから開くか、つまりグリッドが表示されているページの背後にあるコードについては、おそらく多くの選択肢がありません。(これもパターンに違反しますが、複雑な解決策がなければ、できることはすべてです。)私はMVVMパターンを使用していますが、それについては「宗教的」ではありません。効率が指示するとき、私はパターンのいくつかの教訓に違反します。

アイテムをViewModelに渡す限り、アイテムのIDを表すプロパティをViewModelに作成できると思います。更新と追加のデータ入力フォームとして子ウィンドウを使用しています。私はそれらのそれぞれに対してViewModelを作成する傾向があります。あなたの場合、アイテムの詳細を表すViewModelがあります。アイテムと詳細に関連するある種のIDがあります。これは、ViewModelのパブリックプロパティになります。そのIDをパラメーターとして受け取る子ウィンドウのコンストラクターを作成できます。次に、子ウィンドウコンストラクターはViewModelを作成し、それにIDを送信できます。

このようなもの-DomainEditは子ウィンドウの名前です。

    public DomainEdit()
    {
        InitializeComponent();

        devm = new DomainEditVM();
        DataContext = devm;
    }

    public DomainEdit(Guid domainId) : this()
    {
        devm.DomainId = domainId;
        devm.GetDomain();
        txtTitle.Text = "Edit Domain";
    }

次に、グリッドのボタンクリックが発生するコードビハインドから、新しいコンストラクターを使用して子ウィンドウを作成し、グリッド行のアイテムバインディングから取得したIDを渡すと、子ウィンドウの独立したビューモデルが引き継ぎます。

少なくとも、それが私のために働いていることです。

于 2010-06-15T18:01:04.877 に答える
0

メディエーターパターン(複合アプリケーションに関するビュー間のメッセージングサービス)がその役割を果たします。さらに、子ウィンドウサービスで詳細ビューの作成を委任し、選択したオブジェクトをメッセージングサービスを介して渡します。そうすれば、パターン違反は発生しません。

于 2011-01-07T01:58:55.507 に答える