2012-11-10 3 views
2

Я создал очень простой вложенное свойство:вложенное свойство + Style -> ArgumentNullException

public static class ToolBarEx 
{ 
    public static readonly DependencyProperty FocusedExProperty = 
     DependencyProperty.RegisterAttached(
      "FocusedEx", typeof(bool?), typeof(FrameworkElement), 
      new FrameworkPropertyMetadata(false, FocusedExChanged)); 

    private static void FocusedExChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if (d is ToolBar) 
     { 
      if (e.NewValue is bool) 
      { 
       if ((bool)e.NewValue) 
       { 
        (d as ToolBar).Focus(); 
       } 
      } 
     } 
    } 

    public static bool? GetFocusedEx(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(FocusedExProperty); 
    } 

    public static void SetFocusedEx(DependencyObject obj, bool? value) 
    { 
     obj.SetValue(FocusedExProperty, value); 
    } 
} 

Установка этого в Xaml отлично работает, но если я пытаюсь установить его в стиле:

Я получаю ArguemntNullException во время выполнения (говоря: «Значение не может быть нулевым. Имя параметра:.. свойство ")

Я не могу понять, что здесь не так Любой намек appriciated

+0

Когда вы получаете исключение, посмотрите на трассировку стека. Это поможет вам найти место, где ваш код не работает. Если вы все еще не можете решить проблему, то, пожалуйста, разместите stacktrace здесь вместе с вашим вопросом. –

ответ

6

Распространенная ошибка при регистрации присоединенных свойств зависимостей является неправильно указать ownerType аргумент Это должно всегда быть!. класс регистрирующий, ToolBarEx здесь:

public static readonly DependencyProperty FocusedExProperty = 
    DependencyProperty.RegisterAttached(
     "FocusedEx", typeof(bool?), typeof(ToolBarEx), 
     new FrameworkPropertyMetadata(false, FocusedExChanged)); 

И просто избежать ненужного кода в свойстве измененном обработчика можно смело бросить NewValue к bool:

private static void FocusedExChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var toolBar = d as ToolBar; 
    if (toolBar != null && (bool)e.NewValue) 
    { 
     toolBar.Focus(); 
    } 
} 
Смежные вопросы