2012-07-16 3 views
0

런타임시 컬렉션을 Combobox에 바인딩하고 있는데 인덱스를 0으로 설정하고 싶습니다. 원하는 항목에 대한 답을 찾을 수 없었습니다.WPF에서 Combobox의 SelectedIndex를 0으로 설정합니다.

_stationNames = new ObservableCollection<string>(_floorUnits.Unit.Select(f => f.Name)); 
_stationNames.Insert(0, "All"); 
stationsComboBox.ItemsSource = _stationNames; 
stationsComboBox.SelectedIndex = 0;//Doesn;t work 

XAML

<ComboBox x:Name="stationsComboBox" Grid.Row="1" Grid.Column="1" Text="{Binding Name}" 
        SelectionChanged="StationComboBoxSelectionChanged" VerticalAlignment="Center" Margin="3" 
        SelectedIndex="0"/> 
+0

대신 SelectedItem을 설정할 수 있습니다. 단지 당신이 우리에게 보여준 것을 보면서, 왜 작동하지 않는 지 모르겠지만, 새로운 문자열 변수 "All"을 생성하여 그것을 당신의 콜렉션에 삽입하고, 콤보 박스 선택된 항목을 그 변수에 할당하십시오. – Thelonias

+0

동의합니다. 컬렉션의 단일 항목을 나타내는 별도의 속성을 만들어 ComboBox의 SelectedItem 속성에 바인딩하십시오. 그런 다음 컬렉션의 첫 번째 항목으로 설정하십시오. – Xcalibur37

+0

XAML에'Text = "{Binding Name}"'이 필요하지 않습니다. 이는 결과 집합에 단 하나의 열 (필드) 만 있어야하는 'ItemsSource'설정에 대해 중복됩니다. 나는'.SelectedIndex'가 제대로 설정되지 않는 곳에 이런 문제가 발생할 수 있음을 발견했습니다. – vapcguy

답변

1

당신이 윈폼에서와 같이 사용하려고있는 것 같습니다. WPF는 바인딩에 대해 약간 다른 짐승과 훨씬 더 강력합니다.

WPVM을 최대한 활용하려면 MVVM에서 약간 읽는 것이 좋습니다. XAML을 코드 숨김으로 연결하려고 시도하는 대신보기 모델 클래스에 바인딩하면 코드 모음없이 훨씬 유연하게 원하는 것을 수행 할 수 있습니다. 예를 들어

다음 VM을 감안할 때 :

public class MyViewModel: INotifyPropertyChanged 
{ 

    public ObservableCollection<string> StationNames 
    { 
     get; 
     private set; 
    } 

    public Something() 
    { 
     StationNames = new ObservableCollection<string>(new [] {_floorUnits.Unit.Select(f=>f.Name)}); 
     StationNames.Insert(0, "All"); 
    } 

    private string _selectedStationName = null; 
    public string SelectedStationName 
    { 
     get 
     { 
      return _selectedStationName; 
     } 
     set 
     { 
      _selectedStationName = value; 
      FirePropertyChanged("SelectedStationName"); 
     } 
    } 

    private void FirePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
당신은 뷰 모델의 인스턴스의 DataContext를보기의 (XAML 양식)를 설정하고에 콤보 상자 정의를 업데이트 할 수 있습니다

:

<ComboBox x:Name="stationsComboBox" Grid.Row="1" Grid.Column="1" 
        ItemsSource="{Binding Path=StationNames}" SelectedItem={Binding Path=SelectedStationName} VerticalAlignment="Center" Margin="3" 
        SelectedIndex="0"/> 

여기에서 콤보 상자 선택이 변경 될 때마다 VM의 SelectedStationName이 현재 선택 항목을 반영하도록 업데이트되고 VM 코드의 아무 곳에서나 VM의 SelectedStationName을 설정하면 콤보 선택 사항이 업데이트됩니다. (재설정 버튼을 구현하는 등)

일반적으로 제안한 것과 같은 것으로, Units 컬렉션에 직접 바인딩 할 수 있습니다. (또는 VM은 유닛 자체에서 보거나 편집 할 수있는 경우 파생됩니다.) 어떤 경우이든 WPF 바인딩에 대한 연구를 시작하기에 약간의 출발점을 제공해야합니다.

+0

* "묶음에 대해 훨씬 더 강력합니다."* - 의미; WinForms를 사용하여 한 줄에서 동일한 작업을 수행하는 데 더 많은 코드를 작성해야합니다. D –

+0

감사합니다. Codebehind에서 할 수있는 다른 방법이 없습니다. 필자는 이미 코드 숨김 파일을 가지고 있으므로이 시점에서 MVVM으로 변경하기가 어려울 것입니다. –

관련 문제