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) 
     { 

     } 
    } 

이 예제 코드 합니까 WORK :

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

이 예제 코드 합니까 하지 WORK :

<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 : 속성 때 paramname = 속성 자료 = PresentationFramework 스택 트레이스 : BEI System.Windows.Setter.CheckValidProperty (DependencyProperty에 속성) BEI System.Windows HRESULT = -2147467261 메시지 = 값 경우 ParameterName 널이 될 수 없다. Baml2006.WpfSharedBamlSchema 문맥. <> c.b__341_0 (개체 대상, 개체 값) bei System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue (개체 인스턴스, 개체 값) bei MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (XamlMember member, Object obj, 개체 값) BEI MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue (개체 INST, XamlMember 속성, 개체 값) 의 InnerException는 :

I 형 테두리의 클래스에 직접 "MyString에"DP를 구현하기 위해 테스트 한 , 그 때 그것은 작동했다.

나는 그것이 DP가 사용자 정의 컨트롤 내에서 직접 호스팅되지 않는 세터에 관해서는 어떤 종류의 문법 오류이거나 DP 시스템의 다른 행동이라고 생각한다.

힌트 또는 링크 또는 전체 답변을 제공해 주셔서 감사합니다.

내가 얻고 싶은 것이 궁금하다면 : UserControl 라이브러리 안에 모든 유형의 FrameWorkElement에 대해 전역 및 중앙 DP를 구현하려고합니다.

변경 소유자 유형에서을 (정말 나를 도와 시간을내어 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.RegisterAttached()'대신'DependencyProperty.Register()'를 호출하는 이유는 무엇입니까? 'DPHost'가 정적 클래스가 아닌 이유는 무엇입니까? 당신은 그것의 인스턴스가 어디 있습니까? 이 모든 것이 의도적 인 것이라면, 질문에서 중요한 부분을 남겨 두었을 것입니다. 문제를 확실하게 재현 할 수있는 좋은 [mcve]를 제공해주십시오. –

+0

감사합니다, Peter, 맞습니다. DependencyProperty.RegisterAttached()로 변경했지만 오류는 그대로 유지됩니다. – Michael

+0

Peter, 나는 지금 클래스를 static으로 만들고 DependencyProperty.RegisterAttached()로 변경했다. 첫 번째 예는 여전히 작동하지만 두 번째 예도이 새로운 구현에서 작동하지 않습니다. 같은 오류입니다. – Michael

답변

1

마이클, 코드를 보면 실제로는 정규 종속성 속성이 아닌 'attached property '을 정의하려는 것 같습니다. 나는 이것이 방아쇠/세터 문제를 해결할 것이지만 시도하기 위해 다 치지는 못할 것이라고 100 %는 아니다.

또한 'DPHost'일 때 코드의 종속성 속성 '소유자'는 'FrameworkElement'입니다. This answer에 대한 추가 정보가 있습니다.

+0

감사합니다, ibbes,하지만 그건 도움이되지 못했습니다. 이 오류 코드는 에서 발생합니다. Border에는 MyString 속성이 직접 없습니다. 저를 화나게하는 것은 XAML에서는이 속성을 "일반적으로"설정할 수 있지만 컨트롤 템플릿의 설정자에서는 설정할 수 없다는 것입니다. – Michael

+0

마이클, 나는 내 대답을 연장했다. 잘하면이 문제를 해결해야합니다. – ibebbs

+0

오 마이 갓! 이것은 올바른 힌트입니다. 나는 대답으로 나의 질문을 확장 할 것이다. 정말 고맙습니다. – Michael

관련 문제