В сетке данных мне нужен столбец, чьи ячейки иногда доступны только для чтения
Я использую метод 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 для целевого элемента.