Ну вот самое простое решение, которое я нашел. (На самом деле у меня это было до того, как я опубликовал этот и другой вопрос, но смутился из-за такого решения. Так как здесь ничего больше не слышал, и просто на случай, если кто-то еще столкнется с той же проблемой, я подумал, что поделюсь им)
Поместите ссылку на объект ячейки в свойстве Tag DataGridCell. Я делаю это с помощью комбинации XAML и привязки кода внутри конвертера следующим образом:
<Setter Property="Tag">
<Setter.Value>
<MultiBinding Converter="{StaticResource CellViewModelToTagConverter}" Mode="OneWay" UpdateSourceTrigger="PropertyChanged">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}"/>
</MultiBinding>
</Setter.Value>
</Setter>
и
public class CellViewModelToTagConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var row = values[0] as RowViewModel;
var cell = values[1] as DataGridCell;
if (row != null && cell != null)
{
var column = DataGridMethods.GetColumn(cell);
// hack within hack!!! (using tag way is itself a hack?)
var b = new Binding("Self") {Source = row[column]};
cell.SetBinding(FrameworkElement.TagProperty, b);
//...
//return row[column];
return DependencyProperty.UnsetValue;
}
return DependencyProperty.UnsetValue;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
Вы можете сказать, что я думаю об этом решении, по моим комментариям внутри конвертера (мне пришлось добавить свойство Self к объекту Cell и сделать Self = this в конструкторе).
Тем не менее, это позволяет моему кодированию Datagrid быть полностью MVVM - если вы согласитесь, что то, что я сделал внутри конвертера, согласуется с MVVM. В любом случае это работает!
Делая это таким образом, я могу видеть и управлять всем из XAML, например, управлять таким связыванием только для определенных столбцов, помещая XAML в соответствующие стили ячеек столбцов (это не делается через DataGrid.CellStyle).
В любом случае, пример использования:
<Style.Triggers>
<DataTrigger Value="true" Binding="{Binding RelativeSource={RelativeSource Self}, Path=Tag.IsLocked}">
<Setter Property="FontStyle" Value="Italic"/>
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
На уровне XAML это просто и ИМХО элегантно (особенно для различных всплывающих подсказок и всплывающих окон, для которых я интенсивно использую свойства объекта ячейки). Однако я уверен, что есть лучший способ сделать это, не так ли?
Надеюсь, все это исчезнет, когда я смогу использовать Net 4.0 и динамические объекты, но для этого проекта я не смогу.