Кто-нибудь знает, как я могу сделать эквивалентную привязку XAML в коде?
<DataGrid ... >
<DataGrid.Columns>
<DataGridTextColumn
Binding="{Binding Description}" <=== set in code **
/>
</DataGrid.Columns>
</DataGrid>
Приветствия,
Berryl
=== ОБНОВЛЕНИЕ ====
Похоже, что метод, который я искал, это DataGridColumn.GenerateElement
Если это так, то в центре этого вопроса теперь находится вопрос о том, как правильно установить привязку.Причина, по которой я хочу сделать этот код, состоит в том, что моя сетка имеет 7 столбцов, которые визуально идентичны и данные которых можно узнать по индексу.
Поэтому я хочу иметь возможность упростить xaml с помощью подкласса DataGridTextColumnкоторый имеет свойство index и просто имеет:
<DataGrid ... >
<DataGrid.Columns >
<local:DayOfWeekColumn Index="0" />
<local:DayOfWeekColumn Index="1" />
....
<local:DayOfWeekColumn Index="7" />
</DataGrid.Columns >
</DataGrid >
=== ПЕРЕСМОТРЕННЫЙ ВОПРОС ===
Предполагая, что само связывание является логически и синтаксически корректным, что должно соответствовать параметрам для BindingOperations.SetBinding be ??
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;
}
}
}
Все работает кроме Связывание.Я не могу сказать, связано ли это с тем, что моя привязка как-то неправильна (хотя я не получаю очевидных ошибок) или это не подходящее место для ее установки.Когда я его запускаю, столбцы сетки просто пусты.
Есть идеи ??
Приветствия,
Берриль
=== ИСПРАВЛЕНО!===
Логика в последнем обновлении была на самом деле правильной, но, заблудившись во внутренностях DataGrid, я пропустил, что в моем Binding.Path отсутствует свойство, с которым нужно связываться!Благодарим Арана за понимание проблемы, понимание того, что переопределения GenerateElement не были необходимы, и обнаружение того, что источник привязки не должен быть установлен.