Невозможно связать ObjectContext из DataContext с пользовательским вложенным свойством
Я прикрепил собственность
public static ObjectContext GetObjectContext(DataGrid obj)
{
return (ObjectContext)obj.GetValue(ObjectContextProperty);
}
public static void SetObjectContext(DataGrid obj, ObjectContext value)
{
obj.SetValue(ObjectContextProperty, value);
}
public static readonly DependencyProperty ObjectContextProperty =
DependencyProperty.RegisterAttached("ObjectContext", typeof(ObjectContext), typeof(FilterableGrid));
И у меня также есть ViewModel, который имеет свойство Context, которое установлено для корректного ObjectContext (проверено с помощью отладчика).
И этот код XAML:
<DataGrid AutoGenerateColumns="False" Name="gridOrders"
local:FilterableGrid.ObjectContext="{Binding Context}" local:FilterableGrid.IsFilterableGrid="True">
Где локально мое пространство имен.
Я использую этот код в потоке события IsFilterableGrid (поведение atached) для извлечения контекста объекта:
ObjectContext context = FilterableGrid.GetObjectContext(sourceGrid);
И контекстная переменная всегда заканчивается нулем. Хотя DataContext для сетки не является нулевым и указывает на правильный объект (ViewModel).
Есть идеи? Я, кажется, теряю здравомыслие из-за этого...
Изменить: я исследовал немного больше, и если я связываю local:FilterableGrid.IsFilterableGrid="{Binding IsFilterable}"
это работает отлично. Но local:FilterableGrid.ObjectContext="{Binding Context}"
просто нет! Может быть, это как-то связано с типом передаваемого значения (ObjectContext вместо строки или, скажем, bool, которые являются примитивными типами?)?
1 ответ
Я наконец-то решил эту проблему, даже не зная, что помогло - похоже, это была ошибка в.NET или, возможно, VS.
Я сделал следующее: добавил метаданные свойства к вызову RegisterAttached и добавил делегат OnChanged. После этого он только начал работать (привязка правильно). Когда я затем удалил метаданные свойства из вызова RegisterAttached, он продолжал работать.
Поэтому я действительно не знаю, что это было, но сейчас это работает.