Привязка свойства объекта в Item (строка) к свойству DataGridCell в WPF DataGrid - PullRequest
1 голос
/ 18 августа 2010

Использование Release WPF DataGrid Я пытаюсь привязать свойство CellViewModel (которое, конечно, поддерживает INotifyPropertyChanged).Я связываю DataGrid 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, как в приведенном выше - который являетсято, что я хотел бы )), но тогда обнаруживается только объект, с которым он не связан.

То есть у меня может быть вариант конвертера, в котором возвращаемый объект имеет значение row [col] .Islocked , однако тогда свойство 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, поэтому я надеюсь, что ответ будет смущающе простым).

1 Ответ

0 голосов
/ 05 сентября 2010

Ответ здесь тот же, что и в моем другом аналогичном вопросе

...