У меня есть следующий класс, который «размещает» свойство зависимостей, которое зарегистрировано для всех типов 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» было просто абстрактным примером, который поможет мне, чего я хочу достичь.
Возможно, вы пытаетесь реализовать прикрепленное свойство. Почему вы вызываете 'DependencyProperty.Register()' вместо 'DependencyProperty.RegisterAttached()'? Почему 'DPHost' не является статическим классом? Где у вас есть экземпляр? Если это все намеренно, кажется, что вы оставили некоторые важные части из своего вопроса. Пожалуйста, предоставьте хороший [mcve], который надежно воспроизводит проблему. –
Спасибо, Питер, это так. Я изменил его на DependencyProperty.RegisterAttached(), но ошибка остается прежней. – Michael
Питер, я сделал статический класс и изменил его на DependencyProperty.RegisterAttached(). Первый пример все еще работает, второй пример также не работает с этой новой реализацией. Это та же ошибка. – Michael