2017-05-18 8 views
1

私はWPFが新しく、MVVMパターンに従っているので、viewmodelクラスを使用してComboxに値のリストをバインドしようとしています。WPFのViewModelを介してコンボボックスに値をバインド

これは私のセットアップSelectedIndex="0"

は、ここで私はこの

をどうやったのか、これは、コンボボックスのXMLですが、その、コンボボックスのドロップダウンにデフォルトのアイテムとして最初の項目を結合しない以外、正常に動作している

<ComboBox VerticalAlignment="Top" 
      Loaded="ComboBox_Loaded" ItemsSource="{Binding Samples}" SelectedItem="{Binding Path=SAMPLE_NAME}" 
      SelectionChanged="ComboBox_SelectionChanged" DisplayMemberPath="SAMPLE_NAME" SelectedIndex="0" SelectedValuePath="SAMPLE_ID" /> 

これでたSampleModelモデルクラス

public class SampleModel 
{ 
    public int SAMPLE_ID { get; set; } 
    public string SAMPLE_NAME { get; set; } 
} 

これはこれは

public partial class SamplePopup : Window 
{ 
    public SamplePopup() 
    { 
     InitializeComponent();    
     this.DataContext = new SampleViewModel(); 
    } 

    private void ComboBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     try 
     { 

      SampleViewModel ddl = (SampleViewModel)this.DataContext; 
      ddl.FillSamplesDropdown(null); 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     try 
     { 
      SampleViewModel ddl= (SampleViewModel)this.DataContext; 

      // ... Get the ComboBox. 
      var comboBox = sender as ComboBox; 

      ... 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

    } 

} 
+0

ええと、SelectedIndexは地獄のように厄介です。 ItemsSourceとSelectedItemを使うと常に良いです。 SelectedItemで見つかったインスタンスがItemSourceで見つかることを確認してください。 – Will

答えて

0

コンボボックスを存在するファイルの背後にあるコードでのViewModelクラス

public class SampleViewModel : ObservableObject 
{ 
    public SampleViewModel() 
    { 

    } 
    private ObservableCollection<SampleModel> _samples; 

    public ObservableCollection<SampleModel> Samples 
    { 
     get 
     { 
      return _samples; 
     } 
     set 
     { 
      _samples = value; 
      NotifyPropertyChanged("Samples"); 
     } 
    } 

    public void FillSamplesDropdown(string Id) 
    { 
     using (var _context = new SampleBL()) 
     { 
      List<SampleModel> _samples = _context.GetAllSamples(Id); 
      Samples = new ObservableCollection<SampleModel>(_samples); 
     }   

    } 
} 

あるSelectedIndexと気にしないでください、とComboBox_Loadedにコードを取り除きます。 FillSamplesDropdown()の名前をFillSampleList()に変更するか、ユーザーインターフェイスへの参照をしないでください。ビューモデルは、UIが存在することを「知る」べきではありません。次に、viewmodelコンストラクタでFillSampleList()(またはそれを呼び出すもの)を呼び出します。

あなたのviewmodel選択したサンプルのプロパティを与える:

public class SampleViewModel : ObservableObject 
{ 
    public SampleViewModel() 
    { 
    } 

    private SampleModel _selectedSample; 
    public SampleModel SelectedSample 
    { 
     get 
     { 
      return _selectedSample; 
     } 
     set 
     { 
      _selectedSample= value; 
      NotifyPropertyChanged("SelectedSample"); 
     } 
    } 

をあなたはSamplesを初期化すると、最初の項目にSelectedSampleを設定します。

public void FillSamplesList(Object o) 
{ 
    Samples = new ObservableCollection<Sample>(); 

    // ...populate... 

    SelectedSample = Samples.FirstOrDefault(); 
} 

あなたのビューは、その後SelectedSampleをバインドします。これはSelectedItemが何であるかを示しています。あなたのビューモデルにはSAMPLE_NAMEというプロパティがないので、何をしても何もしません。

SelectedSampleIDプロパティをSelectedValueにバインドしていない場合は、SelectedValuePathを設定しないでください。

<ComboBox 
    VerticalAlignment="Top" 
    ItemsSource="{Binding Samples}" 
    SelectedItem="{Binding SelectedSample}" 
    DisplayMemberPath="SAMPLE_NAME" 
    /> 
+0

お返事ありがとうございます、私は申し込みをしてお知らせします –

関連する問題