Использование WPF DataGrid. Мне нужно изменить различные отображаемые и связанные свойства DataGridCell - такие как Foreground, FontStyle, IsEnabled и т. Д. - на основе соответствующего значения свойство объекта ячейки.Привязка свойства объекта ячейки к DataGridCell в WPF DataGrid
Теперь это легко сделать в коде, например (с использованием Observable Коллекция ObservableDictionaries):
var b = new Binding("IsLocked") { Source = row[column], Converter = new BoolToFontStyleConverter() };
cell.SetBinding(Control.FontStyleProperty, b);
и работает отлично, однако я не могу видеть, как сделать это в XAML, так как я могу найти способ установить Путь к свойству объекта ячейки.
Один попытки XAML является:
<Setter Property="FontStyle">
<Setter.Value>
<MultiBinding Converter="{StaticResource IsLockedToFontStyleConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
но нет привязки к не IsLocked свойство
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var row = (RowViewModel) values[0];
var cell = (DataGridCell) values[1];
if (cell != null && row != null)
{
var column = DataGridMethods.GetColumn(cell);
return row[column].IsLocked ? "Italic" : "Normal";
}
return DependencyProperty.UnsetValue;
}
Пожалуйста, обратите внимание, что предыдущая версия вернулась строку [Col] .IsLocked и установите FontStyle с помощью DataTrigger, но возвращенный объект не привязан к базе данных.
Обратите внимание, что приложение не знает, какие столбцы находятся во время разработки.
Наконец, DataTable слишком неэффективны для моих требований, но мне было бы интересно посмотреть, как это делается с DataTables в любом случае, если есть такое решение для них, это может быть полезно в других местах (хотя я предпочитаю использовать коллекции).
Несомненно, это распространенная проблема, и я хочу, чтобы WPO noobie пытался запустить все MVVM в моем проекте, но эта проблема удерживает меня за использование WPF DataGrid.
благодарит за совместное использование. Это довольно уродливо, но это тоже самое простое решение, которое я видел до сих пор для этой проблемы ... – David
Я понимаю, что это старое сообщение, но я обнаружил, что могу просто поставить 'return row [column];' в блоке if .. и он работает. Каков код выше, выполняемый по-другому (т. Е. Создание привязки)? –
Связывание не происходит, кроме IN преобразователя. Если вы не привязываетесь в конвертере и просто возвращаете строку [column], а затем обновляете указанную ячейку, она не привязана и вы не видите обновления в DataGrid. У меня есть намного лучшее и не-хакерское решение, хотя XAML сложнее. Я добавлю его здесь, когда у меня будет время. – Martino