2014-02-27 2 views
0

ObservableCollection에 바인딩 된 ComboBox가 있는데,이 값은 tbPublications으로 채워집니다. 그런 다음 새 레코드를 tbPublications에 삽입하는 다른 Create 폼을 시작하는 DataGrid에서 행을 선택합니다.ComboBox SelectedIndex MVVM WPF

작성 양식을 닫고 ComboBox 양식으로 돌아 가면 새 항목 하나를 지우고 다시 읽음으로써 ObservableCollection으로 사용자를 방금 작성한 항목으로 되돌려 놓습니다. 그런 다음 ComboBox는 새로 채워진 컬렉션의 항목 하나를 모두 표시합니다.

내 문제는 내 ComboBox 폼으로 돌아갈 때 새 게시가 ComboBox 디스플레이에서 선택된 항목으로 설정되어 있지 않기 때문에 사용자가 ComboBox를 클릭하고 항목을 선택해야한다는 것입니다.

페이지로드시 ComboBox에 ObservableCollection 전체를 표시하려고하므로 XAML보기에서 SelectedIndex = "0"을 사용할 수 없습니다. 어쩌면 같은

어쩌면이 문제를 해결하기 위해 뷰 모델의 메소드를 사용하는 방법은 없나요

, 뭔가 ..

 private void SetSelectedIndex() 
     { 
     if (MyObservableCollection.Count == 1) 
     { 
      //Set selected indexer to "0"; 
     } 
     } 

찾을 수는 깨끗한 'MVVM'해결책이 있는지 확실하지 않은이에 대한 해결책, 여기

if (_ModelPublicationsObservableList.Count == 1) 
       { 
        SelectedPublication = _ModelPublication; 
        SetSelectedIndex(); 
       } 

가 selectedIndex의를 현재 주 창을 얻고 설정하는 방법은 다음과 같습니다 : ...

을 내 ObservableCollection에에서 읽은 후 나는이 메소드를 호출

private void SetSelectedIndex() 
    { 
     ArticlesDataGridWindow singleOrDefault = (ComboBoxWindow)Application.Current.Windows.OfType<ComboBoxWindow>().SingleOrDefault(x => x.IsLoaded); 
     singleOrDefault.comboBox1.SelectedIndex = 0;   
    } 

답변

7

콤보 상자의 SelectedItem 속성 사용을 고려 했습니까? 선택한 항목을 가져 오거나 설정하려면 콤보 상자의 선택한 항목 속성을 바인딩 할 수 있습니다. 당신이보기 모델에서 선택한 항목을 설정하려면

XAML

<ComboBox ItemsSource="{Binding Path=Publications}" SelectedItem="{Binding Path=SelectedPublication, Mode=TwoWay}" /> 

뷰 모델

public class ItemListViewModel 
{ 
    public ObservableCollection<Publication> Publications {get; set;} 

    private Publication _selectedPublication; 
    public Publication SelectedPublication 
    { 
     get { return _selectedPublication; } 
     set 
     { 
      if (_selectedPublication== value) return; 
      _selectedPublication= value; 
      RaisePropertyChanged("SelectedPublication"); 
     } 
    } 
} 

, 당신은

SelectedPublication = Publications[0]; 
된 직후 SelectedPublication 속성을 설정할 수 있습니다

출판물 컬렉션에서 필요한 항목을 찾아서 SelectedPublication 속성에 할당 할 수 있습니다.

+2

+1. 이것은 개념적으로 "선택된 값"이'ComboBox'에있는 항목의 * 속성 인 경우를 제외하고는 (항목 자체가 아닌)'SelectedValue'를 사용할 수있는 경우를 제외하고는 거의 항상 갈 것입니다. 및'SelectedValuePath'. MVVM을 따라갈 때'SelectedIndex'를 사용할 이유가 거의 없습니다. –

+0

예, ViewModel에 SelectedPublication 속성이 있습니다.내 XAML이 'SelectedItem = "{SelectedPublication, Mode = TwoWay Binding"으로 설정되어 있지만 ComboBox에 ObservableCollection의 행이 하나도 표시되지 않으면 드롭 다운을 클릭하고 선택해야합니다. – Hardgraf

+0

편집 된, 아마도 가장 깨끗한 MVVM 솔루션이 아닙니다 ... – Hardgraf

2

UpdateSourceTrigger = PropertyChanged을 바인딩에 추가하십시오.

SelectedItem={Binding Path=SelectedPublication, Mode=TwoWay}, UpdateSourceTrigger=PropertyChanged} 
관련 문제