2012-05-15 134 views
1

我有一個綁定到一個ObservableCollection<MyClass>一個DataGrid和我有兩個DataGridTextColumns另一個數據網格 - 名稱和值。 「名稱」列預填充其值應顯示在「值」列中的屬性的名稱。 MyClass實現了INotifyPropertyChanged,因此MyClass對象屬性的任何更改都會更新第一個數據網格。現在,我想在第二個數據網格的Value列中顯示第一個數據網格的當前選定對象(SelectedItem)的屬性,並在發生變化時查看屬性更改,就像在第一個數據網格中一樣。我怎樣才能做到這一點?WPF綁定到一個DataGrid的的SelectedItem

如果你想知道原因,只有一些屬性都顯示在數據網格原,所以對方應該顯示幾乎所有的人。 DataGrid甚至是顯示2列中屬性的好選擇,還是應該考慮其他控件?

回答

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時纔有效。不過,如果您願意快速且骯髒(使用事件處理程序),那麼這是一個很好的開始。

另一個偉大的解決方案是使用行詳細信息。 This is a pretty good intro tutorial on using row details。 當然你也應該閱讀msdn article on the subject

+0

感謝邁克爾,你的代碼是非常有益的。它也適用於DataGridSelecionMode設置爲Extended,因爲SelectedItem屬性獲取當前Selection中的第一個元素,這正是我所需要的。 – marko