WPF: оценка привязки XAML за пределами пользовательского объекта верхнего уровня - PullRequest
0 голосов
/ 24 октября 2018

В моем xaml я объявляю пользовательский объект, у которого есть свойство, ссылающееся на другой пользовательский объект:

public class CustomObjectA : FrameworkElement
{
   public CustomObjectB InnerObj
   {
      get { return GetValue(InnerObjProperty); }
      set { SetValue(InnerObjProperty, value); }
   }

   public static readonly DependencyProperty InnerObjProperty = 
                          DependencyProperty.Register("InnerObj",
                                                      typeof(CustomObjectB),
                                                      typeof(CustomObjectA),
                                                      new PropertyMetadata(null));
}

public class CustomObjectB : FrameworkElement
{
   public string Data
   {
      get { return GetValue(DataProperty); }
      set { SetValue(DataProperty, value); }
   }

   public static readonly DependencyProperty DataProperty = 
                          DependencyProperty.Register("Data",
                                                      typeof(string),
                                                      typeof(CustomObjectB),
                                                      new PropertyMetadata(null));
}

Теперь, когда я объявляю эти объекты в моем xaml таким образом, привязка не работает:

<my:CustomObjectA>
   <my:CustomObjectA.InnerObj>
      <my:CustomObjectB Data="{Binding someValue}" />
   </my:CustomObjectA.InnerObj>
</my:CustomObjectA>

Однако, когда я объявляю эти объекты в моем xaml следующим образом, привязка работает:

<my:CustomObjectB x:Name="testObj" Data="{Binding someValue}" />

<my:CustomObjectA InnerObj="{Binding ElementName=testObj}" />

Я предполагаю, что это потому, что система, отображающая привязки, не выглядит выше верхнего уровняобъект.Мой вопросЕсть ли способ указать системе оценивать выражения привязки за пределами пользовательского объекта верхнего уровня, чтобы xaml-подобный вариант 1 работал?

1 Ответ

0 голосов
/ 24 октября 2018

DataContext не передается в InnerObj.Я заставил его работать, обновив DataContext при изменении InnerObj:

public class CustomObjectA : FrameworkElement
{
    public CustomObjectB InnerObj
    {
        get { return (CustomObjectB)GetValue(InnerObjProperty); }
        set { SetValue(InnerObjProperty, value); }
    }

    public static readonly DependencyProperty InnerObjProperty =
                           DependencyProperty.Register("InnerObj",
                                                       typeof(CustomObjectB),
                                                       typeof(CustomObjectA),
                                                       new FrameworkPropertyMetadata(OnInnerObjUpdated));

    private static void OnInnerObjUpdated(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var local = (CustomObjectA)d;
        var newObj = (CustomObjectB)e.NewValue;

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