2010-12-06 3 views
2

MVVM을 처음 사용하지 않습니다. MVVM을 구현하는 데있어 실수를 저지른 경우 수정하십시오.모델에서 ViewModel과 통신하는 방법

내 Model 클래스에는 Price 및 IsChecked의 두 가지 속성이 있습니다. 내 뷰 모델 클래스에서

public int Price { get; set; } 
    public static int _total; 

    bool _isChecked; 
    public bool IsChecked 
    { 

     get 
     { 
      return _isChecked; 

     } 
     set 
     { 
      _isChecked = value; 

      if (value == true) 
      { 
       _total+= this.Price; 
      } 
      else 
      { 
       _total-= this.Price; 
      } 


     } 
    } 

이 유형 목록의 속성 < 모델 >이며, 그것은보기에 데이터 그리드에 묶여 다른 속성보기에서 TextBlock에 바운스 총입니다.

public int Total 
    { 
     get 
     { 
      return DocumentStoreModel._total; 

     } 
     set 
     { 

     } 

    } 

데이터 그리드는 체크 박스 열이 사용자가 다음 총보기에 반영해야 데이터 그리드에서 체크 박스 열에서 체크 박스를 선택하면 그것은,

<DG:DataGridCheckBoxColumn Header="Select" Binding="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DG:DataGridCheckBoxColumn> 

지금의 IsChecked 속성으로 묶여있다.

내 ViewModel 클래스가 INotifyPropertyChanged 인터페이스를 구현하고 있습니다.

내 모델의 속성이 내 viewModel에 어떻게 표시되는지가 내 qus입니까?

알려 주시기 바랍니다. 어떻게 할 수 있습니까?

답변

0

모델을 ViewModel에 노출 시키면 모델에 INotifyPropertyChanged을 구현해야합니다. 그러나 Total 속성이 정적이고 (afaik) 정적 속성에 대해서는 INotifyPropertyChanged을 사용할 수 없다는 점에서 문제가 있습니다. ViewModel에 구독 할 수있는 모델에 맞춤 이벤트를 만드는 것이 좋습니다. 여기에 예제가 있습니다. (조금 깔끔하게 정리하고 싶을 수도 있습니다.)

public class Model : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    internal static event EventHandler TotalChanged; 
    internal static int Total { get; private set;} 

    private int price; 
    public int Price 
    { 
     get { return price; } 
     set 
     { 
      price = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Price")); 
     } 
    } 

    private bool isChecked; 
    public bool IsChecked 
    { 
     get { return isChecked; } 
     set 
     { isChecked = value; 
      if (value) 
       Total += Price; 
      else 
       Total -= Price; 
      if (TotalChanged != null) 
       TotalChanged(this, EventArgs.Empty); 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); 
     } 
    } 
} 

public class MainViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public int Total 
    { 
     get { return Model.Total; } 
    } 

    public MainViewModel() 
    { 
     Model.TotalChanged += TotalChanged; 
    } 

    private void TotalChanged(object sender, EventArgs e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("Total")); 
    } 
} 
+0

고맙다 딘, 나는 같은 approch를 사용했다. 대리인을 사용한 이벤트 대신에 차이점이있었습니다. 나는이 approch가 MVVM에 따르는 지 아닌지에 대해 확신하지 못했다. 왜 내가 qus를 물 었는지. 감사. –

0

당신은 Command (그것의 ICommand 또는 변형을 구현) 구현하고 뷰 모델에 재산바인드이 체크 박스의 이벤트에 대한보기에로 노출 할 필요가있다.

2

ViewModel의 Total 속성이 모델의 Total 속성을 가리키고 있기 때문에 모델의 전체 변경 사항은 기본적으로 ViewModel에서도 변경됩니다.

IsChecked이 변경되면 ViewModel의 Total 속성에 대해 PropertyChanged 이벤트가 발생할 수 있습니다. 그러면 전체 텍스트 블록의 데이터를 업데이트하기 위해보기가 표시됩니다.

관련 문제