2010-05-04 2 views
1

Я изучаю WPF и пытаюсь создать свой первый UserControl. Моя UserControl состоит изDependencyProperty Ориентация проблемы

  1. StackPanel
  2. StackPanel содержит метку и TextBox

Я пытаюсь создать два свойства зависимостей

  1. Текст для этикетки
  2. ориентации для StackPanel - ориентация влияет на положение метки и текстового блока эффективно

Я успешно создал свойство зависимостей и связал его с моим UserControls. Но когда я создал свойство Orientation, я, кажется, чтобы получить следующие ошибки в получить свойство

Туз оператор должен быть использован с ссылочного типа или обнуляемого типа («System.Windows.Controls.Orientation» не является -nullable тип значения)

public static DependencyProperty OrientationProperty = DependencyProperty.Register("Orientation", typeof(System.Windows.Controls.Orientation), typeof(MyControl), new PropertyMetadata((System.Windows.Controls.Orientation)(Orientation.Horizontal))); 
public Orientation Orientation 
{ 
    get { return GetValue(OrientationProperty) as System.Windows.Controls.Orientation; } 
    set { SetValue(OrientationProperty, value); } 
} 

Цените вашу помощь.

Редактировать: Я изменил код, как показано ниже, и он работает как ожидалось. Но является ли это правильным способом решения проблемы?

public Orientation Orientation 
{ 
     get 
     { 
      Orientation? o = GetValue(OrientationProperty) as System.Windows.Controls.Orientation?; 
      if (o.HasValue) 
      { 
       return (System.Windows.Controls.Orientation)o.Value; 
      } 
      else 
      { 
       return Orientation.Horizontal; 
      } 
     } 
     set { SetValue(OrientationProperty, value); } 
    }  

ответ

4

В сообщении об ошибке говорится все. Оператор as может использоваться только с типом, который является обнуляемым (ссылочным типом, или Nullable<T>),, потому что он будет возвращать либо бросание значения, или нуль.

Что вы пытаетесь использовать его на этом перечисление.

Просто используйте обычный бросок:

get { return (System.Windows.Controls.Orientation) GetValue(OrientationProperty); } 

причин, почему:

  1. Вы определяете значение по умолчанию в вашем DependencyProperty.Register вызова, eliminat ИНГ любого нулевое значения по умолчанию
  2. Вашего DependencyProperty является typeof(Orientation), который не позволяет нули
  3. определение свойства вашего класса является Orientation, который не позволяет нули
  4. Любой попытке установить недопустимое значение с помощью прямых вызовов до SetValue(OrientationProperty, null) получит исключение, поэтому ваш получатель имущества никогда не увидит нулевого значения даже непослушным пользователем.
+0

избили меня :) –

+0

Я только что добавил изменения, внесенные в код. Не могли бы вы прокомментировать мои изменения? Должен ли я нарисовать или использовать метод, который я использовал? – byte

+0

Просто используйте актерский состав. Ваше свойство не допускает значения NULL. (Вы не определили свойство зависимостей как Ориентация ?, и вы не определили свою собственность как Ориентацию?, Поэтому нет ключевого слова as.Тем более, что вы указываете значение Orientation по умолчанию. Горизонтальное определение свойства Dependency, поэтому нет неопределенности. –

Смежные вопросы