2017-02-22 69 views
2

Я создал свой UserControl с Owner собственностиDependency свойства нуля

<shared:NavigationControl Owner="{Binding ElementName=This, Converter={StaticResource TestConverter}}" /> 

This свойством является x:Name моей страницы.

Вот код позади:

public MvxWindowsPage Owner 
{ 
    get { return (MvxWindowsPage)GetValue(OwnerProperty); } 
    set { SetValue(OwnerProperty, value); } 
} 

public static readonly DependencyProperty OwnerProperty = 
       DependencyProperty.Register("Owner", typeof(MvxWindowsPage), typeof(NavigationControl), null); 

Я создал TestConverter, чтобы проверить, если связывание нормально и это.

Почему Owner Недвижимость null в cs?

+0

Вы протестировали Это не ноль? Покажите, где/как вы это устанавливаете. – loopedcode

+0

Можете ли вы показать конвертер, что вы туда возвращаетесь? Я подозреваю, что проблема внутри конвертера - у вас есть «возвращаемое значение», в конце? – Romasz

+0

, конечно, я думаю, проблема в том, что при значении становится привязанным после того, как окно загружено, и я пытаюсь получить значение в моем конструкторе и его до привязки может быть? – miechooy

ответ

0

Вопрос, скорее всего, находится в вашем This. Вам нужно будет подтвердить, что он не является нулевым. Добавьте обратный вызов PropertyChanged, а затем отлаживайте и подтвердите, что значение, отправленное на ваш OwnerProperty, не равно null.

public MvxWindowsPage Owner 
{ 
    get { return (MvxWindowsPage)GetValue(OwnerProperty); } 
    set { SetValue(OwnerProperty, value); } 
} 

public static readonly DependencyProperty OwnerProperty = 
       DependencyProperty.Register("Owner", typeof(MvxWindowsPage), typeof(NavigationControl), new PropertyMetadata(PropChanged)); 

public static void PropChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
     var value = e.NewValue; //confirm this isn't null 
} 
+0

e.NewValue содержит правильное значение; O – miechooy

0

Как я уже проверил проблема в том, что Binding доступен первый в Загрузка события вашей страницы где находится ElementName (вы не устанавливая DataContext в любом месте). Если вы хотите, чтобы значение было доступно в конструкторе страницы, вам придется вызывать обновление привязок ранее. Это может быть сделано с установкой DataContext, который будет ссылаться на этот процесс, однако есть более простой способ с x:Bind:

<local:MyUserControl x:Name="myUsrCtrl" Owner="{x:Bind This, Mode=OneWay, Converter={StaticResource MyConverter}}"/> 

затем в конструкторе Пейджа вы можете ivoke связывающего обновления так:

public BlankPage() 
{ 
    this.InitializeComponent(); 
    this.Bindings.Update(); 
    var aaa = myUsrCtrl.Owner; // this shouldn't be null now 
    // rest of code 

Хотя возможно изменение логики будет лучше, чем вызывать обновление в конструкторе.

+0

Большое спасибо за время Yor. Дело в том, что у меня есть этот пользовательский элемент управления, который является навигационной панелью. Я хотел сделать это видимым на любой странице моего приложения. Навигационное поведение - это выделение текущей просматриваемой страницы. Я думал, что у меня может быть эта панель навигации, на которой находится текущая страница, чтобы я мог выделить значок в этом элементе управления навигационной панелью. – miechooy

+2

@miechooy. Тогда я бы пошел на другой дизайн. Сделайте содержимое вашего окна * Page * с панелью навигации внизу, а остальные заполните рамкой, которая будет содержать остальные страницы. Затем в панели навигации вы можете просто привязываться к «Frame.Content» (при необходимости, при некотором литье). – Romasz