2012-05-25 3 views
3

У меня есть следующее объявление:Dependency Property - Невозможно задать значение от XAML

public static readonly DependencyProperty PassColorProperty = DependencyProperty.RegisterAttached("PassColor", 
      typeof(string), 
      typeof(ColorMasking), 
      new PropertyMetadata("#FFCCFF")); 

    public string PassColor 
    { 
     get { return (string)GetValue(PassColorProperty); } 
     set { SetValue(PassColorProperty, value); } 
    } 

На данный момент этот код не компилируется, потому что я не добавил: DependencyProperty в моем классе. Когда я добавляю этот код, он говорит, что строка PassColor недействительна.

Без такой строки код компилируется, и я могу установить, прочитав свойство из этого класса. Однако я не могу установить его из своего XAML. Он говорит, что свойства не существует. Мой xaml:

<TextBox Grid.Column="1" Grid.Row="8" Margin="3" Width="Auto" Height="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
       b:ColorMasking.Mask=" ... Long Regex Command ... " 
       b:ColorMasking.PassColor="99FF99" /> 

Код для установки маски отлично работает. Думаю, я тоже скопировал все необходимые материалы. Сложно понять, почему я не могу добавить другое свойство.

Если это имеет значение, это изменение я написал этот код: How to define TextBox input restrictions?

EDIT:

public class ColorMasking : DependencyObject 
{ 
    private static readonly DependencyPropertyKey _maskExpressionPropertyKey = DependencyProperty.RegisterAttachedReadOnly("MaskExpression", 
      typeof(Regex), 
      typeof(ColorMasking), 
      new FrameworkPropertyMetadata()); 

    /// <summary> 
    /// Identifies the <see cref="Mask"/> dependency property. 
    /// </summary> 
    /// 
    public static readonly DependencyProperty PassColorProperty = DependencyProperty.Register("PassColor", 
      typeof(string), 
      typeof(ColorMasking), 
      new PropertyMetadata("#99FF99")); 

    public static readonly DependencyProperty FailColorProperty = DependencyProperty.Register("FailColor", 
      typeof(string), 
      typeof(ColorMasking), 
      new PropertyMetadata("#FFCCFF")); 

    public static readonly DependencyProperty MaskProperty = DependencyProperty.RegisterAttached("Mask", 
      typeof(string), 
      typeof(ColorMasking), 
      new FrameworkPropertyMetadata(OnMaskChanged)); 
+0

Я не знаю, если это опечатка, но вы должны установить 'SetValue (PassColorProperty, value);}' там. –

+0

Это было, но это не изменило других проблем. –

+0

Возможно, потому что вы пропустили '#' в b: ColorMasking.PassColor = "99FF99"? – LPL

ответ

3

Код, который вы выложили показывает, что вы регистрируете AttachedProperty так PassColorProperty является а не DependencyPropery вашего класса ColorMasking. Он должен быть доступен через объект, на котором установлено это прикрепленное свойство. Вложенное свойство позволит установить, что имущество на других объектах, а не только

public static void SetPassColor(DependencyObject obj, string passColor) 
    { 
     obj.SetValue(PassColorProperty, passColor); 
    } 

    public static string GetPassColor(DependencyObject obj) 
    { 
     return (string)obj.GetValue(PassColorProperty); 
    } 

исключения этого из MSDN объясняет аксессор для вложенного объекта:

Получить Accessor

подписи для аксессуар GetPropertyName должен быть:

открытый статический объект Get PropertyName (цель объекта)

-Целевой объект может быть указан как более конкретный тип в вашей реализации . Например, метод DockPanel.GetDock вводит параметр как UIElement, так как вложенное свойство предназначено только для для экземпляров UIElement.

- Возвращаемое значение может быть указано как более конкретный тип в вашей реализации . Например, метод GetDock использует его как Dock, , потому что значение может быть установлено только для этого перечисления.

В Комплексе аксессу

Подпись для SetPropertyName аксессору должны быть:

государственной статической силы Набор ИмяСвойства (целевой объект, значение объекта)

-The целевой объект может быть определен как более определенного типа в вашей реализации . Например, метод SetDock использует его как UIElement, , потому что вложенное свойство предназначено только для экземпляров UIElement .

- Объект значения может быть указан как более конкретный тип в вашей реализации . Например, метод SetDock использует его как Dock, , потому что значение может быть установлено только для этого перечисления. Помните, что значение для этого метода - это вход, поступающий от загрузчика XAML , когда он встречает ваше прикрепленное свойство в прикрепленном свойстве использования в разметке. Этот ввод - это значение, указанное как атрибут XAML значение в разметке. Поэтому должно быть преобразование типов, значение serializer или поддержка расширения разметки для используемого вами типа, например , что соответствующий тип может быть создан из значения атрибута (что в конечном итоге является просто строкой).

+0

Добавил (а) новое редактирование. Если я изменю эти два свойства, чтобы они были Register, я до сих пор не могу получить к ним доступ из своего XAML. Mask и MaskExpression - это все, что появляется. –

+0

Извините, я не заметил xaml в сообщении. Вам нужно использовать их в качестве прикрепленных свойств и использовать геттер и сеттер, которые я написал в первом блоке кода. – evanb

+0

Удивительный! Все сработало. Меня это смутило, как это возможно. Рассматривая примеры кода, PassColor назван так же, как переменная, которую я пытаюсь установить с моим свойством. SetPassColor и GetPassColor называются по-разному. Вызывает ли Visual Studio SetXXXXX и GetXXXXX или эти функции не имеют значения в прошлом? –

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

  • Нет связанных вопросов^_^