您好在WPF中的一個快速問題。WPF綁定到組合框
有誰知道我怎麼可以綁定一個組合框,將坐在一個網格到我有一個數據集。
該數據集包含幾列和數行,但我想要採取其中一列,讓我們說ProcessID,並只顯示在COMOBO框。
有沒有人以前做過或知道它如何在WPF中完成。
謝謝 Iffy。
您好在WPF中的一個快速問題。WPF綁定到組合框
有誰知道我怎麼可以綁定一個組合框,將坐在一個網格到我有一個數據集。
該數據集包含幾列和數行,但我想要採取其中一列,讓我們說ProcessID,並只顯示在COMOBO框。
有沒有人以前做過或知道它如何在WPF中完成。
謝謝 Iffy。
您應該使用LINQ到SQL,ADO.Net或實體框架,以提取數據庫中的數據,你不能在內存綁定數據庫表的組合框,但絲毫數據
要做到這一點編程,這裏的一個通用的功能,我有它:
/// <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
來完成 - 這與它聲明式的做法是一樣的(儘管如此,必須有十億個例子,所以我贏了'在這裏展示)。
感謝您的幫助。對此,我真的非常感激。 :) – Iffy 2009-11-11 14:24:56
假設這是一個大寫d數據集可以暴露於XAML作爲一個DataContext對象上的屬性(表示「LookupTable中」表每行的「描述」欄):
<ComboBox ItemsSource="{Binding Path=MyDataSetExposedAsAProperty.Tables[LookupTable].Rows}"
DisplayMemberPath=".[Description]"/>
讀取後你的帖子再次,你的意思是數據集將綁定到一個DataGrid,組合將佔據該DataGrid的列中的每個單元格?或者你的意思是組合只是坐在一個網格? (兩者之間有很大的區別)。下面的答案是當組合是頁面正常流程的一部分時,即它在網格中。 – slugster 2009-11-11 12:30:20
該組合只是坐在一個網格,我只需要加載一些值:-) – Vytas 2009-11-16 11:46:15