В моем конструкторе Window после InitializeComponents мне нужно создать объект и привязать его к сетке данных. Поскольку создание объекта занимает слишком много времени, окнам нужно время, чтобы появиться. Поэтому я решил переместить создание объекта в фоновый поток и «передать обратно» потоку пользовательского интерфейса, выполнив команду dispatcher.invoke для выполнения привязки. Но это не удается.
Странно то, что если я пытаюсь установить видимость прямоугольника внутри Dispatcher.invoke, это работает, но DataGrid.setbinding - нет! Любые идеи? Я пробовал то же самое с фоновым рабочим и threadstart, но все равно получаю ту же ошибку. Я не могу получить доступ к объекту DataGrid, хотя это происходит внутри делегата вызова диспетчера. Я уверен, что что-то упустил в своем понимании того, как это работает. Любые предложения будут ценны. Спасибо!
StartupDelegate s = new StartupDelegate(CreateModel);
s.BeginInvoke(delegate(IAsyncResult aysncResult) { s.EndInvoke(aysncResult); }, null);
internal CreateModel()
{
Model d = new Model();
Dispatcher.Invoke( DispatcherPriority.Normal,
new Action<Model>(
delegate(Model d1)
{
mModel = d1; // mModel is a property defined in Window
Binding b = new Binding();
b.Source = mModel;
MainDataGrid.SetBinding(TreeView.ItemsSourceProperty, mainb); // << dies here with - The calling thread cannot access this object because a different thread owns it.
}
}
ОБНОВЛЕНИЕ: закончилось использование диспетчера таймера, который запускался всего один раз. Помещение кода привязки в его делегат Tick сработало. Но мне все еще любопытно, почему приведенный выше код не работает.