Обновите источники данных combobox / listbox от backgroundworker, которые называются пустотами - PullRequest
0 голосов
/ 19 октября 2011

У меня есть около 5 пустот, которые запрашивают базу данных, а затем устанавливают источник данных некоторых элементов управления. Поскольку пользовательский интерфейс не был заморожен при обновлении элементов управления, я использую BackGroundWorker. Есть ли способ использовать те же пустоты, чтобы обновить элементы управления? просто вызывая их из DoWork ... (происходит сбой при попытке обновить источники данных с пустотой, вызванной DoWork).

Спасибо, Аллон. Отличный ответ! Мне нужно получить лучшую основу для моего кодирования WPF ..: S это то, что я сделал ..

private void UpdateStates(Boolean UpdateLeft, Boolean UpdateRight)
    {
        DataSet ds = new DataSet();
        States.State State = new States.State();

        if (UpdateRight == true)
        {
            cState.Dispatcher.Invoke(() =>
            {
                ds = State.StatesTable();
                cState.DataContext = ds.Tables[0].DefaultView;
                cState.DisplayMemberPath = ds.Tables[0].Columns[1].ToString();
                cState.SelectedValuePath = ds.Tables[0].Columns[0].ToString();
            });
        }
      }

Это нормально? он говорит мне, что он не может преобразовать лямбду в типе system.delegate, потому что это не делегированный тип ... есть идеи? Я гуглю, чтобы получить, но ваша помощь будет здорово для меня! Спасибо!

1 Ответ

0 голосов
/ 19 октября 2011

Если вы хотите взаимодействовать с элементами управления WPF из фонового потока, вы должны использовать их диспетчер для перенаправления вызова в поток пользовательского интерфейса. Поэтому вместо прямого доступа к элементу управления:

var data = LoadAHugeDataset()
myControl.DataContext = data;

Используйте Диспетчер элемента управления для запуска кода:

var data = LoadAHugeDataset()
myControl.Dispatcher.Invoke(() => { myControl.DataContext = data; });
...