有人知道我如何在代码中进行等价的XAML绑定吗?
<DataGrid ... >
<DataGrid.Columns>
<DataGridTextColumn
Binding="{Binding Description}" <=== set in code **
/>
</DataGrid.Columns>
</DataGrid>
干杯,
贝里尔
===更新====
我一直在寻找的方法是DataGridColumn.GenerateElement
如果是这样,那么这个问题的焦点就是如何正确地设置绑定。我之所以要这样做是因为我的网格有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 ??;
}
==编辑aran===
我现在并不是重写generateelement,而是试图让一个静态助手为我设置绑定。在任何情况下,都需要帮助器来补偿无法在MSFT的DataGrid的当前实现中绑定头内容。
基本上,我们的想法是从网格中捕获DC,并根据需要在每个列上使用它,在本例中,这将是头内容、单元格样式和绑定。代码如下:
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;
}
}
}
一切正常
除了
装订。我不知道是因为我的绑定出了问题(尽管我没有明显的错误),还是因为这不是设置它的好地方。当我运行网格列时,它只是空的。
有什么想法吗??
干杯,
贝里尔
= =固定!= =
上一次更新中的逻辑实际上是正确的,但在数据报的内部丢失了我的绑定。路径缺少要绑定的属性!感谢Aran理解这个问题,认识到GenerateElement重写是不必要的,并注意到不应该设置绑定源。