2011-12-28 8 views
0

Webサービスから取得したDataTableがありますが、これはコンボボックスにバインドする必要があります。私はまだXAMLでバインディングをやっていませんでしたので、この質問はコードでバインドすることです。これまでのところ私はコードでWPFでDisplayMemberPathとSelectedValueを設定します。

 cboManager.DataContext = Slurp.DistrictManagerSelect().DefaultView; 
     cboManager.DisplayMemberPath = "Name"; 
     cboManager.SelectedValuePath = "NameListId"; 
     cboManager.SetBinding(ComboBox.ItemsSourceProperty, new Binding()); 

を試してみましたそして私は、私は表示するために経営者のリストを取得するが、私はコンボボックスから選択したときに、私は、[名前]と[NameListId]を取得する両方のケースで

 DataTable tbl = new DataTable(); 
     tbl = Slurp.DistrictManagerSelect(); 
     cboManager.ItemsSource = ((IListSource)tbl).GetList(); 
     cboManager.DisplayMemberPath = "[Name]"; 
     cboManager.SelectedValuePath = "[NameListId]"; 
     DataContext = this; 

を試してみました私が期待している価値ではありません。 XAMLのDataBindingを使用していない以外は何が間違っていますか?私のオリジナルのポストへの回答をして来た後

編集を追加

をので(レイチェルの応答に基づいて)このような数3つのルックス試してみてください。私は彼女が何を意味するのかやっていると仮定すると、

  using (DataTable tbl = Slurp.DistrictManagerSelect()) 
      { 
       List<ManagerList> list = new List<ManagerList>(); 
       foreach (var row in tbl.Rows) 
       { 
        list.Add(new ManagerList 
        { 
         NameListId = (int)row[0],       
         Name = row[1].ToString() 
        }); 
       } 
      } 

を正しい方法でこのエラーが発生しません[オブジェクト型]の式に[]でインデックスを適用できません

答えて

0

DataTablにバインドしようとしましたか直接? Name列とNameListId列がありますか? DataContextをオフにします(すでにItemsSourceを割り当てています)。

DataTable tbl = Slurp.DistrictManagerSelect(); 
    cboManager.ItemsSource = tbl; 
    cboManager.DisplayMemberPath = "Name"; 
    cboManager.SelectedValuePath = "NameListId"; 

IListSourceにキャストすると、すべての列が結合されていると思われます。リストにバインドする場合は、プロパティNameおよびNameListIDを持つ項目を作成する必要があります。

0

私は、各ComboBoxItemはDataRowのDataContextのが含まれており、DataRowクラスはプロパティは基本的にNameまたはNameListId

と呼ばれていない、あなたが伝えようとしている、あなたのItemsSourceDataTableあるので、それはだと思いますComboBoxをDataRow.Nameと表示し、値をDataRow.NameListIdに設定します。どちらも有効なプロパティではありません。

私は通常、私はあなたの答えにいくつかの明確化が必要なオブジェクトにデータを解析することを好む、とItemsSourceList<MyObject>またはObservableCollection<MyObject>

foreach(DataRow row in tbl.Rows) 
    list.Add(new MyObject { Name = row[0].ToString(), NameListId = (int)row[1] }); 

cboManager.ItemsSource = list; 
+0

レイチェルをバインドします。私は正しいアイデアを持っていますか?そして、私はその仕事をするために何をする必要がありますか? –

+0

@BukHixあなたの 'DisplayMemberPath'と' SelectedValuePath'から角括弧を削除してください。私の推測では、 'ManagerList [Name]'にバインドしようとするとエラーが発生します。これは無効です。代わりに 'ManagerList.Name'にバインドしてください。 – Rachel

+0

NameListId =(int)行[0]とName = row [1] .ToString()の2行でエラーが発生していますので、Manager.Listが入っているポイントにもなっていません。私が使用しているコードは、編集に投稿されたものです(DisplayMemberとSelectedValueパスを削除しました)。 –

関連する問題