2011-10-20 4 views
1

그래서 M-V-VM 디자인 패턴을 사용하고 내 바인딩이 올바르게 작동하는 데 문제가있는 WPF 응용 프로그램을 만들고 있습니다.DependencyProperty를 기반으로 스타일 제어

컨트롤의의 IsChecked 속성이 true로 설정되어
  1. , 다음이 포함 두 번째 부울 (쿼리해야합니다

    나는 사용자 정의 ToggleButton을, 나는 그것이 작동 할 방법이 이것이다 ViewModel)도 마찬가지입니다.

  2. 그렇다면 배경색을 한 색으로 설정하고, 그렇지 않으면 다른 색으로 설정하십시오.
  3. IsChecked가 false이면 표준 색상을 사용하십시오.
  4. XAML에서

,이 스타일을 가지고있다 - AFAIK이 점에서 고유 한 트리거를 오버라이드 (override) -

<Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource CustomisableToggleButton}" x:Key="ValidatedTButton"> 
    <Style.Triggers> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding IsChecked}" Value="True" /> 
       <Condition Binding="{Binding IsValid}" Value="True" /> 
      </MultiDataTrigger.Conditions> 
      <MultiDataTrigger.Setters> 
       <Setter Property="Background" Value="Turquoise" /> 
      </MultiDataTrigger.Setters> 
     </MultiDataTrigger> 
     <MultiDataTrigger> 
      <MultiDataTrigger.Conditions> 
       <Condition Binding="{Binding IsChecked}" Value="True" /> 
       <Condition Binding="{Binding IsValid}" Value="False" /> 
      </MultiDataTrigger.Conditions> 
      <MultiDataTrigger.Setters> 
       <Setter Property="Background" Value="LightCoral" /> 
      </MultiDataTrigger.Setters> 
     </MultiDataTrigger> 
     <DataTrigger Binding="{Binding IsChecked}" Value="False"> 
      <Setter Property="Background" Value="AliceBlue" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

(CustomisableToggleButton가 ToggleButtons 적용 모든 스타일이 캐치입니다 경우에 저를 정정 I '컨트롤 클래스에서

) 틀렸다 :

public class ValidatedToggleButton : ToggleButton 
{ 
    public ValidatedToggleButton() 
     : base() { } 

    public static readonly DependencyProperty IsValidProperty = DependencyProperty.Register(
     "IsValid", typeof(bool), typeof(ValidatedToggleButton)); 

    public bool IsValid 
    { 
     get { return (bool)GetValue(IsValidProperty); } 
     set { SetValue(IsValidProperty, value); } 
    } 
} 

그리고 컨트롤의 실제 구현은 :

<Window 
<!--standard window properties--> 
    xmlns:cc="clr-namespace:MVVM.CustomControls"> // namespace where 'ValidatedToggleButton' resides 

<!--other XAML code--> 

    <cc:ValidatedToggleButton 
     IsValid="{Binding Boolean1}" 
     Content="ToggleButton1" 
     IsChecked="{Binding ToggleButton1Checked}" 
     Grid.Row="6" Style="{StaticResource ValidatedTButton}" /> 

</Window> 

이제는 부팅 할 때 (중단 점을 사용하여 확인) 'Boolean1'값을 한번도 확인하지 못합니다. 컨트롤을 누를 때마다 값을 확인하도록하려면 어떻게해야합니까?

답변

1

당신의 XAML 바인딩을 고정 Kent's Answer에, Boolean1이 변경 될 때 PropertyChanged 이벤트가 발생지고 있는지 확인합니다.

get 메서드에 중단 점을 삽입하여이 작업을 수행 할 수 있습니다.

2
<Condition Binding="{Binding IsChecked}" Value="True" /> 

이것은보기 모델 (데이터 컨텍스트)에서 IsChecked이라는 속성을 찾고 있습니다. 당신은 확실히 당신이 원하지 않는 항목입니다 또한

<Condition Binding="{Binding IsChecked, RelativeSource={RelativeSource Self}}" Value="True" /> 
+0

나는 그것을 놓쳤다. 그러나 불행하게도 어떤 시가도. 어쨌든 'IsChecked'는 정상적으로 작동하는 것처럼 보입니다. IsValid는 문제를 일으키는 것 같습니다. –

+0

이 답변을 가져 와서 'IsValid'에 적용하면 흥미로운 결과가 생성됩니다. 이제 ToggleButton은 항상 유효하지 않은 색상으로 표시됩니다. 이상한 색상입니다. –

+0

@KristianFenn'IsValid' 속성으로 같은 일을하십시오. 지금 당장은 당신이'ValidatingToggleButton.DataContext.IsValid'의 값을 검사하고있는 것처럼 보이는데, 나는 그것이 존재하지 않는다고 추측합니다. 'RelativeSource'를'Self'로 설정하면,'ValidatingToggleButton.IsValid'를 보도록 바꾸고 있습니다. – Rachel

관련 문제