2011-02-10 3 views
3

이것은 약간의 문제입니다. (.NET 3.5sp1)WPF ToggleButton 바인딩이 비활성화 된 경우 IsChecked

세 개의 ToggleButton을 포함하는 UserControl이 있습니다. 각각의 IsChecked는 UserControl 자체의 다른 종속성 속성에 바인딩됩니다. 이 중 두 개는 기본값이 true이고, 기본값은 false입니다.

응용 프로그램을 시작할 때 UserControl 자체 및 해당 내용을 사용할 수 없습니다. 나중에 활성화되면 세 개의 버튼이 모두 눌려지지 않은 상태로 나타납니다. 그러나 코드 속성은 여전히 ​​올바른 상태입니다.

버튼을 클릭하면 속성이 올바르게 전환되고 UI (해당 버튼 만 해당)가 올바른 상태를 반영하도록 업데이트됩니다 (즉, 누르지 않은 것처럼 보이지만 바운드 값이 true 인 버튼을 클릭하면 처음에는 눈에 보이는 변화는 보이지 않지만 바운드 값은 false로 업데이트됩니다. 두 번째 시간 동안 "글리치가있는"버튼을 누르면 정상적으로 작동합니다 (토글하면 예상대로 버튼이 눌립니다).

시작시 UserControl이 비활성화되어 있지 않으면 등록 정보의 상태에 따라 버튼이 올바르게 나타납니다.

불행히도 UserControl은 시작할 때 사용하지 않도록 설정되어 있으므로 실제로 사용할 수는 없습니다. 대체 솔루션을 기대하고 있습니다. 어떤 아이디어?

(나는 속성은 사용자 컨트롤의 Load 이벤트에서 사실로 설정 한 후 허위로 기본 제작 시도했습니다. 어떤 차이를하지 않습니다.)

답변

2

같은 이상한 문제로 .NET 4.0에서 발생 잘. 문제가 해결 될 것이라고 믿는 대신에 코드를 바꿀 수 있다면 코드를 통해 IsEnabled을 설정하고 바인딩하지 않으면 문제가 발생하는 것으로 나타났습니다.

그렇지 않으면 해결 방법이 필요하다고 생각합니다. 여기에는이 방법이 있습니다. 처음 IsEnabledTrue으로 설정된 경우 UserControl의 DataContext를 다시 설정하십시오.

public UserControl1() 
{ 
    InitializeComponent(); 

    DependencyPropertyDescriptor descriptor = 
     DependencyPropertyDescriptor.FromProperty(UserControl1.IsEnabledProperty, 
                typeof(UserControl1)); 
    EventHandler isEnabledChanged = null; 
    isEnabledChanged = new EventHandler(delegate 
    { 
     if (IsEnabled == true) 
     { 
      descriptor.RemoveValueChanged(this, isEnabledChanged); 
      var dataContext = this.DataContext; 
      this.DataContext = null; 
      this.DataContext = dataContext; 
     } 
    }); 
    descriptor.AddValueChanged(this, isEnabledChanged); 
} 
+0

사실은 내가이 과도하게 단순화 수도 -의 IsEnabled 데이터 바인딩 아니지만 사용자가 직접 제어에가 나무 위로 요소 이상에서입니다. 그러나이 해킹은 올바른 DataContext를 조정 한 후에 작동합니다. (항상 UserControl 자체가 아니라 첫 번째 자식에 내부 컨텍스트를 넣었습니다. 그렇지 않으면 외부에서 오버라이드되어 지저분해질 수 있습니다.) – Miral

0

나는 다소 비슷한 상황을 겪었고 다음과 같은 답변이 내 경우에 더 적절하다는 것이 입증되었습니다. 그것은 많은 문제를 덜어 줍니다.이 솔루션을보고있는 누군가가 그것을 알아 채지 못했을 경우에 대비하여 여기에 대한 참조가 유용 할 것입니다.

WPF ToggleButton incorrect render behavior

건배

만수르

관련 문제