2012-08-10 4 views
0

콤보 박스가있는 창이 있습니다. 이 콤보 상자에는 5 개의 콤보 박스 항목이 있습니다. 예에서 MVVM이 아닌 SelectedItem을 수정하십시오.

나는 내가 두 가지 방법으로 시도했습니다 3, 4, 5

항목을 선택할 수 없습니다 것을 원하는 : MVVM 방법코드 숨김 방법을

MVVM 방법 :

XAML :

<ComboBox SelectedIndex="{Binding Path=SaveIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding Path=SaveSelectedItemCheck}" Name="SaveCombobox"> 
,

의 ViewModel :

public object SaveSelectedItemCheck 
{ 
    get { return _control.SaveCombobox.Items[CurrentSaveIndex]; } 
    set 
    { 
     if (value != _control.SaveCombobox.Items[0] && value != _control.SaveCombobox.Items[1]) 
     { 
      OnPropertyChanged("SaveSelectedItemCheck"); 
     } 
    } 
} 

코드 숨김 방법 :

XAML :

<ComboBox SelectedIndex="{Binding Path=SaveIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionChanged="Save_SelectionChanged"> 

코드 숨김 :

private void Save_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ComboBox combobox = sender as ComboBox; 
    if(combobox == null) 
    { 
     return; 
    } 

    if (combobox.SelectedItem != combobox.Items[0] && combobox.SelectedItem != combobox.Items[1]) 
    { 
     combobox.SelectedItem = combobox.Items[1]; 
     e.Handled = true; 
    } 
} 

그러나 그것은 단지 더럽 코드 숨김 방식으로 작동합니다 .

MVVM 방식으로 작동하지 않는 이유는 무엇입니까?

+0

왜 selectedindex와 selecteditem에 바인딩합니까? 그냥 SelectedItem을 사용하십시오. 또 다른 방법은 ItemsSource를 CollectionView에 바인딩하는 것입니다. collectionView에는 selected 속성이 포함되어 있으므로 선택한 항목에 바인딩해야합니다. –

답변

1

다른 사람들이 말했듯이 실제로 속성 설정자에서는 값을 설정하지 않습니다.

그러나 IMO의 중요성은 MVVM 핵심 개념을 오해 한 것 같습니다. 문제의 많은 당신의 ViewModel 코드가 있습니다 : 당신은 UI 개념/오브젝트있는, _control.SaveCombobox.Items를 참조하고

public object SaveSelectedItemCheck 
{ 
    get { return _control.SaveCombobox.Items[CurrentSaveIndex]; } 
    set 
    { 
     if (value != _control.SaveCombobox.Items[0] && value != _control.SaveCombobox.Items[1]) 
     { 
      OnPropertyChanged("SaveSelectedItemCheck"); 
     } 
    } 
} 

. 이것은 ViewModel의 목표는 아닙니다. 그리고 객체를 반환하면 모델을 강력하게 입력해야합니다!

은 당신이해야하는 것은 다음과 같다 : (어떤 식 으로든에서보기 컨트롤을 처리하지 않는

  • 모델 (강력한 형식의 POCO 클래스)
  • ViewModels 그럴 수도 별도의 전망 및 ViewModels을 다른 어셈블리에 추가하려면
  • Combobox
  • 과 같은 컨트롤에 대해 ItemsSource에 바인딩 된 뷰가 필요합니다.

    public class SomeObject : INotifyPropertyChanged 
    { 
        private string someProperty; 
        public string SomeProperty 
        { 
         get { return this.someProperty; } 
         set 
         { 
          if (this.someProperty != value) 
          { 
           this.someProperty = value; 
           OnPropertyChanged("SomeProperty"); 
          } 
         } 
        } 
        ... 
    } 
    

    뷰 모델 :

    public class ViewModel : SomeViewModelBase 
    { 
        private ObservableCollection<SomeObject> items; 
        private SomeObject selectedItem; 
    
        public ObservableCollection<SomeObject> Items 
        { 
         get 
         { 
          return items; 
         } 
         set 
         { 
          if (this.items != value) 
          { 
           this.items = value; 
           OnPropertyChanged("Items"); 
          } 
         } 
        } 
    
        public ObservableCollection<SomeObject> SelectedItem 
        { 
         get 
         { 
          return selectedItem; 
         } 
         set 
         { 
          if (this.selectedItem != value) 
          { 
           this.selectedItem = value; 
           OnPropertyChanged("SelectedItem"); 
          } 
         } 
        } 
    
        ... 
    
        // Anywhere in your view model: 
        this.Items = new ObservableCollection<SomeObject>(...); 
        this.SelectedItem = this.Items[2]; 
        // Etc. 
    } 
    

    보기 :

    <ComboBox 
        ItemsSource={Binding Items} 
        SelectedItem="{Binding SelectedItem, Mode=TwoWay}"> 
    

    코드 숨김 전망 :

모델 (210)

아무것도 귀하의 예를 들어

0

MVVM 방식으로 설정자에 값을 저장하지 마십시오.

+0

+1, 게시 된 코드가 선택한 색인을 변경하지 않습니다. –

+0

@ wild downvoter, 설명해 주시겠습니까? –

1

값이 유효한지 여부에 관계없이 ViewModel 메서드는 속성 값을 설정하지 않습니다. 값이 유효한지 여부에 따라 이벤트가 발생합니다.

실제로 자세히 살펴보면 ViewModel 코드가 지원하는 컨트롤을 직접 참조하고있는 것처럼 보일 수 있으므로 MVVM 패턴을 다소 잘못 이해 한 것처럼 보입니다. "정상적인"속성에 따라 속성에 대한 후원 필드가 있어야합니다. 값이 뷰 모델에 의해 오버라이드 (override) 된 경우 다음 PropertyChanged가 콤보 상자의 값을 다시 설정해야하는 UI를 통지하기 때문에 값이 유효한지 여부

더 중요한

, 당신은 PropertyChanged 이벤트가 발생한다 유효한 값.

관련 문제