2016-09-06 3 views
-1

У меня есть следующий класс, который «размещает» свойство зависимостей, которое зарегистрировано для всех типов FrameWorkElement.Настройка свойства «размещенного» зависимостей в шаблоне управления не работает

Здесь:

public class DPHost: DependencyObject 
    { 
     public static readonly DependencyProperty MyStringProperty = DependencyProperty.Register("MyString", typeof(String), typeof(FrameworkElement), new PropertyMetadata(OnMyStringChanged)); 

     public static String GetMyString(DependencyObject obj) 
     { 
      return (String)obj.GetValue(MyStringProperty); 
     } 

     public static void SetMyString(DependencyObject obj, String value) 
     { 
      obj.SetValue(MyStringProperty, value); 
     } 

     public String MyString 
     { 
      get { return (String)GetValue(MyStringProperty); } 
      set { SetValue(MyStringProperty, value); } 
     } 


     private static void OnMyStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 

     } 
    } 

Этот пример кода ДЕЛАЕТ РАБОТЫ:

<Border x:Name="_ErrorBorder" c:DPHost.MyString="ABC"/> 

Этот пример кода ДЕЛАЕТ НЕ РАБОТЫ:

<ControlTemplate.Triggers> 
    <Trigger SourceName="_ImageCircle" Property="IsEnabled" Value="True"> 
     <Setter TargetName="_ErrorBorder" Property="c:DPHost.MyString" Value="ABC"/> 
    </Trigger> 
</ControlTemplate.Triggers> 

код компилируется, данный триггер работает на 100% правильно, но когда я использую приведенный выше код присваиватель «_ErrorBorder», я получаю ошибку:

«System.Windows.Markup.XamlParseException произошло»

InnerException: HResult = -2147467261 Сообщение = значение не может быть пустым ParameterName: недвижимость ParamName = свойство Источник = PresentationFramework StackTrace: бей System.Windows.Setter.CheckValidProperty (DependencyProperty недвижимость) бея System.Windows. Baml2006.WpfSharedBamlSchema Контекст. <> c.b__341_0 (Object target, Object value) bei System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue (экземпляр объекта, значение объекта) bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (член XamlMember, Object obj, значение объекта) Bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (Объект инст, XamlMember свойство, значение объекта) InnerException:

Я испытал для реализации «MyString» DP непосредственно в классе типа границы , тогда это сработало.

Я думаю, что это какая-то синтаксическая ошибка или другое поведение системы DP, когда речь заходит о сеттерах, где DP непосредственно не размещен внутри пользовательского элемента управления.

Благодарим за любые советы или ссылки или полные ответы!

Если вам интересно, чего я хочу достичь: Мне нравится внедрять глобальные и центральные DP для всех типов FrameWorkElement внутри библиотеки UserControl.




Это ответ/решение этого вопроса: (большой кредит на ibebbs нашли время, чтобы действительно помочь мне)

Изменение типа владельца от «FrameworkElement» в «DPHost» и пусть класс DPHost наследуется от FrameworkElement.

public class DPHost:FrameworkElement 
    { 

     public static readonly DependencyProperty MyStringProperty = DependencyProperty.RegisterAttached("MyString", typeof(String), typeof(DPHost), new PropertyMetadata(OnMyStringChanged)); 


     public static String GetMyString(DependencyObject obj) 
     { 
      return (String)obj.GetValue(MyStringProperty); 
     } 

     public static void SetMyString(DependencyObject obj, String value) 
     { 
      obj.SetValue(MyStringProperty, value); 
     } 

     private static void OnMyStringChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 

     } 
    } 

1.Теперь это РАБОТАЕТ:

<Border x:Name="_ErrorBorder" c:DPHost.MyString="ABC"/> 

2. Теперь это тоже работает (это была ошибка)

<ControlTemplate.Triggers> 
    <Trigger SourceName="_ImageCircle" Property="IsEnabled" Value="True"> 
     <Setter TargetName="_ErrorBorder" Property="c:DPHost.MyString" Value="THE BORDER" /> 
     <Setter TargetName="_ImageCircle" Property="c:DPHost.MyString" Value="THE CIRCLE"/> 
    </Trigger> 
    </ControlTemplate.Triggers> 

3. Просто небольшое объяснение, что это все о

Мне нужны разные зависимости для ВСЕ типы FrameworkElement, без создания каких-либо новых базовых классов. Целью является создание универсальной анимационной структуры. Таким образом, это свойство «MyString» было просто абстрактным примером, который поможет мне, чего я хочу достичь.

+0

Возможно, вы пытаетесь реализовать прикрепленное свойство. Почему вы вызываете 'DependencyProperty.Register()' вместо 'DependencyProperty.RegisterAttached()'? Почему 'DPHost' не является статическим классом? Где у вас есть экземпляр? Если это все намеренно, кажется, что вы оставили некоторые важные части из своего вопроса. Пожалуйста, предоставьте хороший [mcve], который надежно воспроизводит проблему. –

+0

Спасибо, Питер, это так. Я изменил его на DependencyProperty.RegisterAttached(), но ошибка остается прежней. – Michael

+0

Питер, я сделал статический класс и изменил его на DependencyProperty.RegisterAttached(). Первый пример все еще работает, второй пример также не работает с этой новой реализацией. Это та же ошибка. – Michael

ответ

1

Michael, глядя на код, похоже, что вы на самом деле пытаетесь определить 'attached property ', а не как свойство регулярной зависимости. Я не на 100%, что это решит проблему триггера/сеттера, но не может помешать попробовать.

Также отмечено, что «владелец» свойства зависимостей в вашем коде является «FrameworkElement», когда он должен быть «DPHost». This answer имеет дополнительную информацию.

+0

Спасибо, ibbes, но это не помогло. Ошибка в этой строке кода: . Тип Border не имеет свойства MyString напрямую. Меня тошнит, что я могу установить это свойство «нормально» в XAML, но не в настройщике шаблона управления. – Michael

+0

Майкл, я расширил свой ответ. Должно надеяться, решить проблему. – ibebbs

+0

ОН МОЙ БОГ! ЭТО ПРАВИЛЬНОЕ СОВЕЩАНИЕ. Я отвечу на вопрос. Огромное спасибо. – Michael

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