Привязка WPF к комбинированной коробке - PullRequest
1 голос
/ 11 ноября 2009

Привет, быстрый вопрос действительно в WPF.

Кто-нибудь знает, как я могу связать поле со списком, который будет находиться в сетке, с набором данных, который у меня есть.

Набор данных содержит несколько столбцов и числовых строк, но я хочу взять один из столбцов, скажем, ProcessID и просто показать это в поле со списком.

Кто-нибудь делал это раньше или знает, как это можно сделать в WPF.

Спасибо Сомнительный.

Ответы [ 3 ]

2 голосов
/ 21 января 2010

Предполагая, что это набор данных D с большой буквы, который вы можете предоставить XAML как свойство объекта DataContext (показывая столбец «Описание» для каждой строки таблицы «LookupTable»):

    <ComboBox ItemsSource="{Binding Path=MyDataSetExposedAsAProperty.Tables[LookupTable].Rows}"
DisplayMemberPath=".[Description]"/>
1 голос
/ 11 ноября 2009

Чтобы сделать это программно, вот общая функция, которую я имею для этого:

    /// <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 элемента управления и открытым свойством на вашей странице - это так же, как это делается декларативно (хотя там должно быть миллиард примеров этого, поэтому я не буду показывать это здесь).

0 голосов
/ 11 ноября 2009

Для извлечения данных из базы данных вы должны использовать LINQ to SQL, ADO.Net или инфраструктуру сущностей. Вы не можете связать комбинированный список с таблицей базы данных, но с данными в памяти

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...