2017-11-08 9 views
4

버튼이 State.Away 및 State.Stop에 표시되도록하고 싶지만 상태가 State.Away 및 State.Stop과 다른 경우에도 버튼이 항상 표시됩니다.XAML의 버튼 가시성을 뷰 모델에 바인딩합니까?

XAML :

<Button Text="Hello" IsVisible="{Binding View}"/> 

의 ViewModel : 당신은 그럼 당신은 변환기에 버튼을 결합 Visibility

public class StateToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     if (value is State) 
     { 
      State state = (State)value; 
      switch (state) 
      { 
       case State.Away: 
       case State.Gone: 
        return Visibility.Visible; 
       default: 
        return Visibility.Collapsed; 
      } 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
      System.Globalization.CultureInfo culture) 
    { 
     return State.None; // your default state 
    } 
} 

State에서 IValueConverter를 만들 수 있습니다

private bool myBool; 

public bool View 
{ 
    get 
    { 
     if (State == State.Away || State == State.Gone) 
     { 
      myBool = true; 
     } 
     else 
     { 
      myBool = false;     
     } 
     return myBool; 
    } 
} 
+2

VM에서 INotifyPropertyChanged를 구현하고 View 값이 변경되면 PropertyChanged 이벤트를 발생시켜야합니다. – Jason

+0

항상 false를 반환하면 버튼이 보이지 않습니까? 그런 다음 바인딩은 "상태"가 변경되었을 때 "보기"가 변경되었음을 알지 못합니다. –

+0

또한 컨트롤의 DataContext가 ViewModel에 올바르게 설정되어 있는지 확인하십시오. – Viju

답변

2

<Window.Resources> 
    <local:StateToVisibilityConverter x:Key="StateToVisibilityConverter"/> 
</Window.Resources> 

<Button Text="Hello" Visibility="{Binding Path=State, Converter={StaticResource StateToVisibilityConverter}}"/> 
+0

기존 코드를 기반으로 일부 네임 스페이스를 포함해야 할 수도 있습니다. 실제 코드가 예제 코드와 정확히 일치하지 않으면 클래스 이름 중 일부가 잘못되었을 수 있습니다. 그러나 높은 수준에서 이것은 모두 정확하고 완벽합니다. –