2011-03-20 7 views
2

WPVM에서 MVVM 접근 방식을 사용하여 사용자가 콤보 상자에서 항목 하나를 선택할 수있게했습니다. 모델에는 가능한 옵션 집합이 들어 있으며 콤보 상자는이 집합에 바인딩되어 있으며 현재 선택 항목은 다시 내 모델의 속성에 바인딩됩니다. 이 부분은 잘 작동합니다.WPF MVVM : 콤보 박스에없는 항목 추가

이제 사용자가 임의의 텍스트를 콤보 박스에 입력 할 수있게하고 싶습니다. 텍스트가 기존 항목과 일치하지 않으면 프로그램에서 새 항목을 추가 할 것인지 묻습니다. 그는 또한 행동을 취소하고 다른 항목을 선택할 수 있어야합니다.

MVVM 패턴 내에서 어떻게 처리 할 수 ​​있습니까?

답변

1

ViewModel의 바운드 속성 설정 도구에서 텍스트의 "기존"상태를 확인합니다. 이 시점에서 이벤트를 발생시키고 발생 상황에 따라 수행 할 작업을 결정하는 메커니즘이 필요합니다.

예 : 적절한 UI를 제시하고 그에 따라 e.Outcome의 값을 설정 NotExistingNameSet에 이벤트 핸들러를 추가

enum Outcome { Add, Cancel } 

class BlahEventArgs : EventArgs 
{ 
    Outcome Outcome { get; set; } 
} 

class ViewModel 
{ 
    private string name; 

    public EventHandler<BlahEventArgs> NotExistingNameSet; 

    public Name 
    { 
     get { return this.name; } 

     set 
     { 
      if (/* value is existing */) { 
       this.name = value; 
       return; 
      } 

      var handler = this.NotExistingNameSet; 
      if (handler == null) { 
       // you can't just return here, because the UI 
       // will desync from the data model. 
       throw new ArgumentOutOfRangeException("value"); 
      } 

      var e = new BlahEventArgs { Outcome = Outcome.Add }; 
      handler(this, e); 
      switch (e.Outcome) { 
       case Outcome.Add: 
        // Add the new data 
        this.name = value; 
        break; 
       case Outcome.Cancel: 
        throw new Exception("Cancelled property set"); 
      } 
     } 
    } 
} 

보기.