2010-07-17 35 views
3

我必須訪問DataGrid的活動單元格(其周圍有黑色邊框的單元格)的值。DataGrid如何獲取CurrentCell的值

幸運的是,DataGrid有很多屬性,例如CurrentCell,CurrentItem SelectedCells SelectedItem和SelectedItems似乎爲我提供了我想要的數據。

但是我還沒有想出如何以簡單的方式訪問單元格。我也已經改變了......

SelectionMode="Single" SelectionUnit="Cell" 

...特性,但在最後,我不得不做這樣的事情:

DataGridCellInfo cellInfo = dataGrid.CurrentCell; 

if(null != cellInfo && cellInfo.IsValid) 
{ 
    object[] array = cellInfo.Item as object[]; 
    if (null != array && cellInfo.Column.DisplayIndex >= 0 && cellInfo.Column.DisplayIndex < array.Length) 
    { 
     object cellValue = array[cellInfo.Column.DisplayIndex]; 
     if (null != cellValue) 
     { 
      // Here we are 
     } 
    } 
} 

在我的例子,該行通過包含對象的數組建各種對象類型。我知道我可以在cellInfo.Column上執行綁定(在投射後),但這不是重點。我的問題是,如果我犯了一些錯誤的東西,因爲我無法想象DataGrid這樣一個如此強大的軟件,如果不進行如此多的編碼就無法提供所需的價值。

我錯過了什麼,或者它是否真的如此複雜以獲得當前的單元格值。

UPDATE

由於Quartermeister在他很好的答案解釋,沒有進入細胞值的一個屬性,這是有一個meaningfull原因。此外,如果讓用戶重新排列列,請注意像我在示例中那樣使用DisplayIndex。

+0

爲什麼您需要直接訪問該值? datagrid被設計爲可以與數據綁定和mvvm模式一起工作,這應該避免直接訪問ui類(在你的情況下是數據網格單元格)。 – 2010-07-17 18:28:31

+0

在這種情況下,我看不出MVVM如何幫助我?如何將當前單元格綁定到我的視圖模型(或我必須綁定的屬性),以便我的視圖模型跟蹤當前單元格,而無需像上面那樣編寫一些代碼。我會對這樣的解決方案感興趣,因爲我不喜歡我的方式。 – HCL 2010-07-17 18:56:10

+0

請參閱 http://stackoverflow.com/questions/3272910/fill-a-datagrid-with-data-that-lies-in-a-array 也許你可以幫忙嗎? – HCL 2010-07-17 19:19:18

回答

6

真的很複雜。問題是DataGridColumn不一定綁定到單個值。例如,DataGridTemplateColumn只有一個DataTemplate。該模板可能會使用行對象中的多個值,甚至根本沒有值,因此無法有效地爲該單元格返回單個值。

如果列爲DataGridBoundColumn(例如DataGridTextColumn),則可以保證具有單個值。正如你所說,你可以通過執行綁定來獲得價值。例如,你可以做這樣的事情(注意,這將不是一個綁定工作使用的ElementName或的RelativeSource,但你可能不會使用那些在DataGridBoundColumn):

var cellInfo = dataGrid.CurrentCell; 
if (cellInfo != null) 
{ 
    var column = cellInfo.Column as DataGridBoundColumn; 
    if (column != null) 
    { 
     var element = new FrameworkElement() { DataContext = cellInfo.Item }; 
     BindingOperations.SetBinding(element, FrameworkElement.TagProperty, column.Binding); 
     var cellValue = element.Tag; 
    } 
} 

請注意,你可能不想使用DisplayIndex屬性,因爲如果用戶手動拖動列來重新排列列,那麼可以更改該屬性。

+0

+1和接受:感謝這個詳細的解釋。現在對我來說很有意義。順便說一句,很好的方式來執行綁定。 – HCL 2010-07-17 18:43:19

+0

謝謝! Jeeze,似乎真的不應該做那麼多工作...... – 2015-09-23 17:11:17