2013-05-16 2 views
2

내 응용 프로그램에서 필자는 스택 패널을 가지고있어 숨길 필요가있을 때까지 숨겨 지거나 (축소 된 상태로 유지해야합니다.), 사용자가 버튼을 클릭합니다.컨트롤에서 제어 가시성을 변경하는 문제

MVVM 기술에 대한 기본적인 지식을 사용하여 실행 한 문제는 스택 패널의 가시성을 내 viewmodel의 속성에 바인딩하는 것입니다. 이 속성은 Visibility 형식이며 단추는 ICommand 인터페이스를 사용하는 사용자 지정 명령을 사용하여 내 viewmodel에서 메서드를 호출합니다.이 단계에서는 스택 패널이 바인딩되는 visibility 속성의 값을 간단히 변경합니다.

명령 자체가 성공적으로 메서드를 호출하고 가시성 속성이 변경되었음을 확인했습니다.하지만 가시성 속성을 바인딩 한 스택 패널은 보이지 않습니다.

내가 사용하고 코드의 예시를 구성하려고합니다 : 난

public Visibility panelVisibility { get; set; } 

public void ShowThePanel() 
{ 
    panelVisibility = Visibility.Visible; 
} 

:

<Button Content="Show StackPanel" Command="{Binding Path=ShowPanelCommand}" /> 
<StackPanel Visibility="{Binding Path=panelVisibility}" /> 

그리고 뷰 모델의 명령에 의해 호출 방법에

C#/.NET과 프로그래밍 전반에 새로운 기능을 제공합니다.

나는 짧은 시간에 많은 것을 배웠다. 그러나 잠시 동안 나는 이렇게 벽돌 벽을 치다.

일부 안내 원조는 나에게 매우 중요합니다.

나는이 질문에서 개략적으로 설명한 결과를 얻기 위해 더 나은 /보다 효율적인 기술에 대한 제안을하지만, 내가 이해하지 못했던 것을 알고 싶다. 이 특별한 방법을 사용하는 동안.

도움 주셔서 감사합니다. 당신이해야 할 일은

답변

0

ViewModelINotifyPropertyChanged을 구현할 수 있습니다 : 다음

public class YourViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public void ShowThePanel() 
    { 
     PanelVisibility = Visibility.Visible; 
    } 

    private Visibility panelVisibility; 

    public Visibility PanelVisibility 
    { 
     get 
     { 
      return panelVisibility 
     } 
     set 
     { 
      panelVisibility = value; 
      OnPropertyChanged("PanelVisibility"); 
     } 
    } 
} 

을에 XAML :

<StackPanel Visibility="{Binding Path=PanelVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

편집 :

에서 INotifyPropertyChanged 인터페이스는 통지하기 위해서 사용

클라이언트, 보통 바인딩 클라이언트, 그 pr operty 값이 변경되었습니다. 예제의 경우 FirstName이라는 속성이있는 Person 개체를 생각해 봅니다. 에 일반 속성 변경 알림을 제공하려면 Person 유형 이 INotifyPropertyChanged 인터페이스를 구현하고 이름이 변경되면 PropertyChanged 이벤트를 발생시킵니다. 변경 알림이 결합 된 클라이언트와 데이터 소스, 당신의 바운드 형 사이에 바인딩 에서 발생하는 해야 하나 :

  • 가에서 INotifyPropertyChanged 인터페이스 (선호)를 구현합니다.
  • 바운드 형식의 각 속성에 대한 변경 이벤트를 제공하십시오.

두 가지를 모두 수행하지 마십시오.

+0

@ 샌드위치 속성의 값이 변경된 UI를 알리는 방법이 필요합니다 그리고 이것은 단지 하나의 방법 (MVVM 101)입니다. 'set' 아래에있는'OnPropertyChanged ("PanelVisibility");를 사용하여 UI에 변경 사항을 알립니다. Automatic 속성을 사용하면 ViewModel의 변경 사항을 UI에 알리지 않습니다. – Willem

0

.net 4 이하를 사용하고 있고 viewModel 기본 클래스에 INotifyPropertyChanged 코드를 설정하고 panelVisibility 속성의 setter 메서드에서 호출한다고 가정합니다.

INotifyPropertyChanged는 바인딩이 변경해야한다는 것을 수신 대기 컨트롤에 알리는 메커니즘입니다.

예를 들어, 기본 뷰 모델

public class baseViewModel : INotifyPropertyChanged 
{ 
    // boiler-plate 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

여기 Implementing INotifyPropertyChanged - does a better way exist?

.NET 4.5은 약간의 차이 인에서 INotifyPropertyChanged 인터페이스를 구현하고 호출하는 방법에 대한 정보의 힙도 있습니다. 내가 사용하는 4.5 havent, 그래서 그것에 대한 의견을 말하지 않을 수

관련 문제