Привязка IsReadOnly свойство DataGridColumn в зависимости от строки - PullRequest
0 голосов
/ 30 января 2020

В сетке данных мне нужен столбец, чьи ячейки иногда доступны только для чтения

Я использую метод bindingproxy:

<local:MyDataGrid.Resources>
     <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</local:MyDataGrid.Resources>

, где Data - это пользовательский DependencyProperty

public object Data
{
    get { return (object)GetValue(DataProperty); }
    set { SetValue(DataProperty, value); }
}
// Using a DependencyProperty as the backing store for Data. 
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy),  
                          new UIPropertyMetadata(null));

В xaml у меня есть:

<DataGridCheckBoxColumn Header="MyProp"
    IsReadOnly="{Binding MyProp.IsReadOnly, Source={StaticResource proxy}"
    Binding="{Binding MyProp.MyValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    Visibility="{Binding Data.AnotherProp, Source={StaticResource proxy}, Converter={StaticResource BoolToVisibilityConverter}}"

Привязка для Visibility и Binding работает как положено.
Data - это DataContext модели представления, а AnotherProp - одно из ее свойств ,

Представление также имеет свойство public ObservableCollection<MyItem> MyItems { get; private set; }, которое, конечно, является ItemsSource из DataGrid и действительно Binding связано со свойствами каждого отдельного MyItem каждой строки.

Это не работает для привязки IsReadOnly. Что мне нужно сделать, чтобы это работало?
Ошибка пути BindingExpression: свойство «MyProp» не найдено в объекте BindingProxy.
Это понятно, поскольку MyProp не принадлежит Data.
Но почему привязка Binding работает?

Также IsReadOnly="{Binding Data.MyProp.IsReadOnly, Source={StaticResource proxy}}", конечно, не работает, потому что MyProp является свойством MyItem, а не моделью представления.

Также IsReadOnly="{Binding MyProp.IsReadOnly}" без привязки, прокси не работает.
Не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.

1 Ответ

0 голосов
/ 30 января 2020

Свойство Binding является особенным. Это тип BindingBase, и он используется для применения привязки к элементу, который создается в методе GenerateElement, т.е. вы не привязываете это свойство к свойству источника. Вы скорее устанавливаете для него объект Binding.

Если вы хотите связать с IsReadOnly, вам нужно использовать прокси, как вы делаете при связывании со свойством Visibility.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...