2012-12-12 3 views
0

단추가 있고 BooleanSwitch라는 뷰 모델에 부울 속성이 있습니다. BooleanSwitch에 해당하는 경우 BooleanSwitch는 XAML 스타일 바인딩

거짓 그리고 때

  • 녹색 ON,
  • 빨간색 OFF, 내가 원하는 :

    나는이 될 버튼의 텍스트와 데 ForeColor를 원하는 값이 변경되면 동적으로 변경됩니다.

    물론 코드 숨김으로 처리 할 수 ​​있습니다. 그러나 XAML 솔루션이 있습니까? 나는 다음과 같은 시도 :

    <Style x:Key="SwitchButtonStyle" TargetType="Button"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=BooleanSwitch}" Value="true"> 
          <Setter Property="Foreground" Value="Red"/> 
          <Setter Property="Content" Value="ON"/> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding Path=BooleanSwitch}" Value="false"> 
          <Setter Property="Foreground" Value="#00AA00" /> 
          <Setter Property="Content" Value="OFF"/> 
         </DataTrigger> 
        </Style.Triggers> 
    </Style> 
    
    
    <Button Click="button_Click" Style="{DynamicResource SwitchButtonStyle}" /> 
    

    을 그리고 클릭 방법은 다음과 같습니다

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
        BooleanSwitch = !BooleanSwitch; 
    } 
    

    BooleanSwitch의 코드는 간단 (.NET 4.5) 할 수 없습니다

    private bool privateBooleanSwitch; 
        public bool BooleanSwitch 
        { 
         get { return privateBooleanSwitch; } 
         set 
         { 
          if (value == privateBooleanSwitch) 
           return; 
    
          privateBooleanSwitch= value; 
          OnPropertyChanged(); 
         } 
        } 
    

    로드되면 트리거가 활성화되고 버튼은 빨간색으로 표시되지만 버튼을 클릭하면 더 이상 작동하지 않습니다. DataTriggers의 작동 방식을 잘 이해하지 못하고 있습니다.

    내가 뭘 잘못하고 있니?

    버튼은 단일 용도의 버튼이지만 특정 요소 내부에서 DataTrigger를 사용할 수 없다는 것을 이미 알아 냈습니다. 난 텍스트 & 색상을 포함하는 다른 속성을 만드는 방법에 대해 생각하고 단추 속성에 바인딩하지만 불필요한 코드를 맞춤법으로 보일뿐입니다. 색상 및 텍스트를 정의하는 데 XAML을 사용하고 싶습니다.

+0

코드가 작동합니다. DataContext를 설정 했습니까? OnPropertyChanged가 올바르게 구현되었는지 확신합니까? – LPL

+0

그것은 작동합니까? 허. 나는 DataContext를 올바르게 설정했다고 확신하지만 오늘 오후에 집에 돌아 오면 OnPropertyChanged를 살펴볼 것입니다. – Mirek

+0

OnPropertyChanged에 인수가없는 이유는 무엇입니까? 메소드는 어떤 속성이 변경되었는지 어떻게 알 수 있습니까? 추신 :이 코드는 나를 위해 또한 작동;) –

답변

1

나.

멍청한.

맞춰봐.

public abstract class ViewModelBase 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

는 사실 을에서 INotifyPropertyChanged 인터페이스를 구현하지만 클래스 정의에서 그것을 언급하는 것을 잊었다.

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "") 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

여기서 실수를하는 대신, WPF 트리거를 이해하는 데 실수가 있어야합니다. LPL 덕분입니다.