WPF绑定到组合框

时间:2009-11-11 12:00:12

标签: wpf binding

你真的在WPF中提出了一个简单的问题。

有没有人知道我如何将一个组合框绑定到我拥有的数据集中。

数据集包含多个列和数字行,但我想取一个列,让我们说ProcessID并在comobo框中显示。

之前是否有人这样做过,或者知道如何在WPF中完成此任务。

由于 伊菲。

3 个答案:

答案 0 :(得分:2)

假设这是一个大写D DataSet,您可以将其作为DataContext对象上的属性公开给XAML(显示“LookupTable”表中每行的“Description”列):

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

答案 1 :(得分: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);

评论会告诉您需要知道的一切。它也可以通过在控件的Binding属性和页面上的公共属性之间创建ItemSource来以编程方式完成 - 这与声明性地完成相同(必须有十亿个例子)在那里,所以我不会在这里显示。)

答案 2 :(得分:0)

你应该使用LINQ to SQL,ADO.Net或实体框架从数据库中提取数据,你不能将combobox与数据库表绑定,而是在内存中使用whit数据