DependencyProperty Ориентация проблемы - PullRequest
1 голос
/ 04 мая 2010

Я изучаю WPF и пытаюсь создать свой первый UserControl. Мой UserControl состоит из

  1. StackPanel
  2. StackPanel содержит Label и TextBox

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

  1. Текст для ярлыка
  2. Ориентация для StackPanel - Ориентация будет эффективно влиять на положение Label и TextBox

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

Оператор as должен использоваться с ссылочным типом или обнуляемым типом ('System.Windows.Controls.Orientation' - это тип значения, не обнуляемый)

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); }
}

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

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

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); }
    }      

1 Ответ

4 голосов
/ 04 мая 2010

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

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

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

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

Причины, по которым:

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