有誰知道我可以如何在代碼中執行等效的XAML綁定?代碼中的DataGridColumn綁定
<DataGrid ... >
<DataGrid.Columns>
<DataGridTextColumn
Binding="{Binding Description}" <=== set in code **
/>
</DataGrid.Columns>
</DataGrid>
乾杯,
Berryl
=== UPDATE ====
它看起來像我一直在尋找的方法是DataGridColumn.GenerateElement
如果是這樣,那麼這個問題的焦點是如何正確設置Binding。我想做這個代碼的原因是我的網格有7列在視覺上是完全相同的,並且其數據可以被索引所知。
所以我希望能夠通過使用具有索引屬性的子類DataGridTextColumn簡化XAML,只是有:
<DataGrid ... >
<DataGrid.Columns >
<local:DayOfWeekColumn Index="0" />
<local:DayOfWeekColumn Index="1" />
....
<local:DayOfWeekColumn Index="7" />
</DataGrid.Columns >
</DataGrid >
===經修訂的課題===
假設綁定本身在邏輯上和語法上是正確的,參數BindingOperations.SetBinding應該是什麼?
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem) {
var activity = (ActivityViewModel)dataItem;
var cellData = activity.Allocations[Index];
var b = new Binding
{
Source = cellData,
UpdateSourceTrigger = UpdateSourceTrigger.LostFocus,
Converter = new AllocationAmountConverter()
};
BindingOperations.SetBinding(??, ??, b);
return ??;
}
=== EDITS爲ARAN =====
我不重寫GenerateElement現在,而是試圖讓一個靜態輔助設置我爲我結合。在任何情況下都需要幫助程序來補償無法綁定當前MSFT DataGrid實現中的標題內容。
基本上這個想法是從網格中捕獲DC,並根據需要在每個列上使用DC,在這種情況下,這些列將是Header內容,單元格樣式和Binding。下面是代碼:
public class TimesheetDataGridColumnContextHelper
{
static TimesheetDataGridColumnContextHelper() {
FrameworkElement.DataContextProperty.AddOwner(typeof (DataGridTextColumn));
FrameworkElement.DataContextProperty.OverrideMetadata(
typeof (DataGrid),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits, OnDataContextChanged));
}
public static void OnDataContextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var grid = d as DataGrid;
if (grid == null || !grid.Name.Equals("adminActivityGrid")) return;
foreach (var col in grid.Columns) {
var dowCol = col as DayOfTheWeekColumn;
if (dowCol == null) continue;
var context = (IActivityCollectionViewModelBase) e.NewValue;
var index = Convert.ToInt32(dowCol.DowIndex);
_setHeader(dowCol, context, index);
var editStyle = (Style) grid.FindResource("GridCellDataEntryStyle");
dowCol.CellStyle = editStyle;
_setBinding(dowCol, index, context);
}
}
private static void _setBinding(DayOfTheWeekColumn dowCol, int index, IActivityCollectionViewModelBase context) {
dowCol.Binding = new Binding
{
Path = new PropertyPath(string.Format("Allocations[{0}]", index)),
UpdateSourceTrigger = UpdateSourceTrigger.LostFocus,
Converter = new AllocationAmountConverter()
};
}
private static void _setHeader(DataGridColumn col, IActivityCollectionViewModelBase context, int index)
{
var date = context.HeaderDates[index];
var tb = new TextBlock
{
Text = date.ToString(Strings.ShortDayOfWeekFormat),
ToolTip = date.ToLongDateString()
};
col.Header = tb;
}
}
}
一切正常,除了綁定。我不知道是不是因爲我的綁定是錯誤的(儘管我沒有明顯的錯誤),或者這不是一個設置它的好地方。當我運行它時,網格列只是空的。
任何想法??
乾杯,
Berryl
===修復! ===
上次更新中的邏輯實際上是正確的,但在DataGrid的內部丟失了我錯過了我的Binding.Path缺少要綁定的屬性!感謝Aran瞭解這個問題,意識到GenerateElement覆蓋不是必需的,並且捕捉到綁定源不應該被設置。
嗨阿蘭。是的,我的小提琴正在爲此做一個鍛鍊,但似乎值得一試。請參閱我上次的編輯(「編輯ARAN」)以獲取最新方法。乾杯! – Berryl 2010-08-09 21:35:31
明白了。是我的綁定路徑中的一個蹩腳的語法錯誤(應該是「Allocations [{0}]。Amount」)感謝您的幫助! – Berryl 2010-08-11 00:18:40