InitializeComponents 이후 내 윈도우 생성자에서 객체를 만들고이를 DataGrid에 바인딩해야합니다. 개체 생성에 너무 많은 시간이 걸리므로 창을 표시하는 데 시간이 걸립니다. 그래서 객체 생성을 백그라운드 스레드로 옮기고 바인딩을 수행하기 위해 dispatcher.invoke를 수행하여 UI 스레드로 "위임"하기로 결정했습니다. 그러나 이것은 실패합니다.WPF : UI 스레드와 백그라운드 스레드간에 객체 전달
이상한 일은 Dispatcher.invoke 내부에있는 사각형의 가시성을 설정하려고하면 작동하지만 DataGrid.setbinding은 작동하지 않습니다. 어떤 아이디어? 백그라운드 작업자와 threadstart를 사용하여 동일한 작업을 시도했지만 동일한 오류가 계속 발생합니다. Dispatcher 내부에서 일어나는 일이 대리자를 호출하더라도 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.
}
}
UPDATE : 은 번을 실행 것 dispatchertimer를 사용하여 종료. 틱 대리인에 바인딩 코드를 넣는 것이 효과적입니다. 하지만 위의 코드가 왜 그렇게 궁금한 지 궁금합니다.
xaml에서이 작업을 시도한 것이 아니라 속성에 대한 바인딩을 설정하고 inited 속성을 null로 설정했습니다. 따라서 대표단은 mModel = d1이라는 한 줄만 있습니다.그러나 아무 일도 일어나지 않았습니다. 의존성 속성이 아니라 notifypropertychanged를 구현하는 일반 속성입니다. – Sharun
개체가 DependencyObject에서 파생 된 경우 (창이있는 경우) INotifyPropertyChanged가 작동하지 않기 때문에 비슷한 문제가 있어도 DependencyProperty로 변경 한 이유는 의심 스럽습니다. –