1

にバインドされたデータグリッドがありObservableCollection<MyClass>、名前と値の 2 つの DataGridTextColumns を持つ別のデータグリッドがあります。[名前] 列には、[値] 列に値を表示するプロパティの名前が事前に入力されています。MyClass は を実装するINotifyPropertyChangedため、オブジェクトのプロパティが変更されるとMyClass、最初のデータグリッドが更新されます。ここで、最初のデータ グリッドの現在選択されているオブジェクト (SelectedItem) のプロパティを 2 番目のデータ グリッドの [値] 列に表示し、最初のデータ グリッドのようにプロパティの変化を確認したいと思います。どうすればこれを達成できますか?

理由が気になる場合は、元のデータグリッドには一部のプロパティしか表示されないため、他のプロパティにはほとんどすべてが表示されるはずです。データグリッドは、プロパティを 2 列に表示するのに適していますか、それとも他のコントロールを検討する必要がありますか?

4

1 に答える 1

2

これは、かなり一般的な問題に対する 1 つの便利な解決策のように思えます。

2 つのデータ グリッドでこれを行う最も簡単な方法は、コード ビハインドとリフレクションを使用することです。まず、各プロパティの名前と値を表示する型を定義します。

class PropertyModel {
    private readonly string _name = "";
    private readonly object _value = null;


    public PropertyModel(string name, object value) {
       _name = name ?? "";
       _value = _value;
    }

    public string Name {
        get { return _name; }
    }

    public object Value {
        get { return _value; }
    }
}

次に、コード ビハインドにイベント ハンドラーを追加して、最初のデータグリッドでの選択の変更を処理します。

private void _onDataGrid1SelectionChanged(object sender, SelectedCellsChangedEventArgs e) {
   if (e.AddedCells.Count > 0) {
        var props = new Collection<PropertyModel>();
        var obj = _dataGrid1.SelectedItem;
        foreach(var prop in obj.GetType().GetProperties()) {
            props.Add(new PropertyModel(prop.Name, prop.GetValue(obj, null)));
        }


        _dataGrid2.ItemsSource = props;
   }

}

上記のコードは非常に大雑把であり、DataGrid1 の SelectionMode が Single に設定されている場合にのみ機能することに注意してください。ただし、(イベント ハンドラーを使用して) 手早く簡単に実行する場合は、ここから開始することをお勧めします。

別の優れたソリューションは、行の詳細を使用することです。 これは、行の詳細を使用するための非常に優れた入門チュートリアルです。もちろん、件名に関する msdn の記事も読む必要があります。

于 2012-05-16T00:03:20.143 に答える