Привязка свойства объекта в Item (строка) к свойству DataGridCell в WPF DataGrid
Использование Release WPF DataGrid
Я пытаюсь связать с собственностью CellViewModel
(что поддерживает INotifyPropertyChanged
конечно). Я связываю DataGrid
"s ItemsSource
для ObservableCollection
типа RowViewModel
(который унаследован от Dr.WPF ObservableDictonary
) типа CellViewModel
и я хочу привязать к свойству CellViewModel
,
Например, в дальнейшем я пытаюсь изменить состояние DatagridCell.FontStyle
собственность на основе моего CellViewModel.IsLocked
логическое свойство (так что если IsLocked
затем Курсив).
Во-первых, чтобы получить доступ к соответствующему CellViewModelobject в XAML:
<DataGrid.Resources>
<cv:RowColumnToCellConverter x:Key="RowColumnToCellConverter"/>
<MultiBinding x:Key="CellViewModel" Converter="{StaticResource RowColumnToCellConverter}">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}" Path="Column" />
</MultiBinding>
</DataGrid.Resources>
RowColumnToCellConverter является
public class RowColumnToCellConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
RowViewModel<string,CellViewModel> row = values[0] as RowViewModel<string,CellViewModel>;
string column = (values[1] as DataGridColumn).SortMemberPath;
string col = column.Substring(1, column.Length - 2);
return row[col];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
Затем создайте DataTrigger
в XAML:
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Value="True" >
<DataTrigger.Binding >
<Binding Path="isLocked" Source="{StaticResource CellViewModel}" />
</DataTrigger.Binding>
<Setter Property="FontStyle" Value="Italic"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
Теперь это не работает, но является примером того, что я хотел бы сделать, надеюсь, это не за горами. Конечно MultiBinding
здесь никогда не устанавливается (так как Converter
никогда не вызывается проверка в отладке).
В другом месте MultiBinding/MultiConverter
работает (хотя я сократил его для этого поста, надеюсь, не внесло никаких ошибок), что является частью DataTrigger/MultiTrigger
(не как StaticResource, как в предыдущем примере - это то, что я хотел бы), но тогда он показывает только объект, с которым не связан сам.
То есть у меня может быть вариант конвертера, в котором возвращаемый объект является строкой [col]. Однако, Islocked свойство не зарегистрировано для уведомлений PropertyChange.
Теперь я не могу добавить IsLocked
свойство (или я могу?) в качестве третьего оператора связывания для BindingCollection в исходном MultiBind, так как до тех пор, пока MultiBind не вернет объект, третьему оператору связывания {Bind Path=IsLocked} не на что будет ссылаться.
Итак, я попробовал вложение MultiBinding
в чем-то вроде следующего, который не работает, так как BindingCollection
принимает только объекты Binding, а не MultBinding
объекты.
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger>
<DataTrigger.Binding>
<MultiBinding>
<MultiBinding Converter="{StaticResource RowColumnToCellConverter}">
<Binding />
<Binding RelativeSource="{x:Static RelativeSource.Self}" Path="Column" />
</MultiBinding>
<Binding Path="IsLocked"/>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="FontStyle" Value="Italic"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
Надеюсь, моя проблема будет ясна из вышесказанного, даже если мои попытки решения еще далеко. Так чего мне не хватает? (Вероятно, очень много, так как я использую WPF/MVVM только несколько недель, и это действительно базовое требование для работы с любой DataGrid, поэтому я надеюсь, что ответ будет довольно смущающим).