2015-02-05 2 views
-1

테두리의 커서를 TemplateInstance의 개인 속성에 바인딩하려고합니다.
XAML :WPF C# TemplateInstance에 바인딩이 작동하지 않습니다.

 <Border Cursor="{Binding ToggleCursor}"> 

C 번호 : 나는 또한 내 TemplateClass에서에서 INotifyPropertyChanged를 구현 한

 private Cursor ToggleCursor { 
      get { 
       return IsEnabled ? Cursors.Hand : Cursors.Arrow; 
      } 
     } 

:

 public event PropertyChangedEventHandler PropertyChanged; 
     protected void OnPropertyChanged(string PropertyName) { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) { 
       handler(this, new PropertyChangedEventArgs(PropertyName)); 
      } 
     } 

물론 나는 프레임 워크 통지 변경 사항에 대한 :
는 (I는 여전히 재산 적어도 한 시간을 가야 그렇게하지 않을 경우에도)

 IsEnabledChanged += (sender, e) => OnIsEnabledChanged(); 

 private void OnIsEnabledChanged() { 
      OnPropertyChanged("ToggleCursor"); 
     } 

그리고 네, 클래스는 인터페이스를 구현 .

국경은 결코 재산에서 가치를 가지고 가지 않는다이다.
F.e. 속성에 Cursors.Cross을 반환하면 여전히 Cursors.Arrow이 표시됩니다.
아이디어가 있으십니까?

예 :이 애니메이션 동작과 파란색 테두리가있는 체크 박스의 일종이다
enter image description here

바인딩 커서를 받으면에. 문제 해결 - public 속성을해야합니다 데이터 컨텍스트 -__-

+1

당신이 IsEnabled를 변경할 때 ToggleCursor에 대한 속성 변경을 제기하고 있습니까? –

+0

@ pm_2 예, toadflakz에 대한 내 의견을 참조하십시오. –

+0

여기에 사용자 지정 컨트롤을 만들고 해당 컨트롤에 따라 Border 요소의 커서를 변경하려고합니까? 제어가 활성화 되었습니까? –

답변

0

ToggleCursor을 설정 잊으 당신은 ToggleCursor 속성 값이 변경 (것 IsEnabled 속성 변경 관련이있는 것으로) 할 때마다 OnPropertyChanged("ToggleCursor")를 호출해야합니다.

는 일반적으로이 오버라이드 (override) OnPropertyChanged를 방법을 통해 될 것입니다 :

private override void OnPropertyChanged(string PropertyName) 
{ 
    base.OnPropertyChanged(PropertyName); 
    switch (PropertyName) 
    { 
     case "IsEnabled": 
      OnPropertyChanged("ToggleCursor"); 
      break; 
    } 
} 

편집 : 또한 publicToggleCursor 속성을 설정하고

영업 이익은 TemplateInstance에 대한 DataContext 할당이 자신의 문제를 해결했다.

+0

나는 또한 이렇게 : private void OnIsEnabledChanged() { OnPropertyChanged ("ToggleCursor"); }하지만 효과가 없습니다 (메서드가 이벤트를 구독 함). –

+1

ToggleCursor **는 ** public이어야합니다. – toadflakz

+0

나는 그렇게 생각하지 않는다. 그러나 나는 같은 결과로 시도했다 ... –

1

기존 컨트롤을 다시 템플릿으로 만들거나 자신 만의 템플릿을 만들 때 상관없이 컨트롤 스타일이 필요하며 해당 스타일 안에 컨트롤 템플릿을 설정해야합니다.

은 컨트롤 템플릿에서 당신은 상황을 타개하기 위해 트리거를 사용할 수 있습니다

<Style TargetType="{x:Type YourCustomControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type YourCustomControl}"> 
       <Border x:Name="Border"> 
        ... other elements, etc ... 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="True"> 
         <Setter TargetName="Border" Property="Cursor" Value="Hand" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

은 그럼 당신은이 작업을 수행하는 컨트롤 클래스에 사용자 지정 속성을 만들 필요가 없습니다.

+0

물론! 하지만 필자는 의견을 유지하는 것이 더 쉽기 때문에 코드로 대부분의 일을 처리하기를 좋아합니다. additinal 정보 주셔서 감사합니다 :) –

관련 문제