2009-11-11 297 views
1

您好在WPF中的一個快速問題。WPF綁定到組合框

有誰知道我怎麼可以綁定一個組合框,將坐在一個網格到我有一個數據集。

該數據集包含幾列和數行,但我想要採取其中一列,讓我們說ProcessID,並只顯示在COMOBO框。

有沒有人以前做過或知道它如何在WPF中完成。

謝謝 Iffy。

+0

讀取後你的帖子再次,你的意思是數據集將綁定到一個DataGrid,組合將佔據該DataGrid的列中的每個單元格?或者你的意思是組合只是坐在一個網格? (兩者之間有很大的區別)。下面的答案是當組合是頁面正常流程的一部分時,即它在網格中。 – slugster 2009-11-11 12:30:20

+0

該組合只是坐在一個網格,我只需要加載一些值:-) – Vytas 2009-11-16 11:46:15

回答

0

您應該使用LINQ到SQL,ADO.Net或實體框架,以提取數據庫中的數據,你不能在內存綁定數據庫表的組合框,但絲毫數據

1

要做到這一點編程,這裏的一個通用的功能,我有它:

/// <summary> 
    /// Thread safe method for databinding the specified ComboBox with the specified data. 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="ctrl">The Combo to be databound.</param> 
    /// <param name="datasource">The data to be bound to the Combo.</param> 
    /// <param name="displayPath">The name of the property in the data objects that should be used for the display value.</param> 
    /// <param name="valuePath">The name of the property in the data objects that should be used for the value.</param> 
    /// <remarks> 
    /// This function was written as generic so that it doesn't matter what types the IEnumerabe datasource is, it can handle them all. 
    /// </remarks> 
    private void UpdateComboDataSource<T>(ComboBox ctrl, IEnumerable<T> datasource, string displayPath, string valuePath) 
    { 
     if (ctrl == null) 
      throw new ArgumentNullException("Control to be bound must not be null"); 

     //check if we are on the control's UI thread: 
     if (ctrl.Dispatcher.CheckAccess()) 
     { 
      //we have full access to the control, no threading issues, so let's rip it up and databind it 
      datasource = datasource.OrderBy(x => x); 
      if (displayPath != null && ctrl.DisplayMemberPath == null) 
       ctrl.DisplayMemberPath = displayPath; 
      if (valuePath != null && ctrl.SelectedValuePath == null) 
       ctrl.SelectedValuePath = valuePath; 

      ctrl.ItemsSource = datasource; 

      //be nice to the user, if there is only one item then automatically select it 
      ctrl.SelectedIndex = datasource.Count() == 1 ? 0 : -1; 
     } 
     else 
     { 
      //we don't have full access to the control because we are running on a different thread, so 
      //we need to marshal a call to this function from the control's UI thread 
      UpdateComboDataSourceDelegate<T> del = new UpdateComboDataSourceDelegate<T>(this.UpdateComboDataSource); 
      ctrl.Dispatcher.BeginInvoke(del, ctrl, datasource, displayPath, valuePath); 
     } 
    } 

    private delegate void UpdateComboDataSourceDelegate<T>(ComboBox ctrl, IEnumerable<T> dataSource, string displayPath, string valuePath); 

評論告訴你你需要知道的一切。它也可以通過在控件的ItemSource屬性和頁面上的公共屬性之間創建一個Binding來完成 - 這與它聲明式的做法是一樣的(儘管如此,必須有十億個例子,所以我贏了'在這裏展示)。

+0

感謝您的幫助。對此,我真的非常感激。 :) – Iffy 2009-11-11 14:24:56

2

假設這是一個大寫d數據集可以暴露於XAML作爲一個DataContext對象上的屬性(表示「LookupTable中」表每行的「描述」欄):

<ComboBox ItemsSource="{Binding Path=MyDataSetExposedAsAProperty.Tables[LookupTable].Rows}" 
DisplayMemberPath=".[Description]"/>