db에서 데이터를 가져와 비동기 적으로 UI에 표시하는 데 문제가 있습니다. 내가 MVVM의 빛을 사용하고 I 버튼을 클릭하면, 액션은 뷰 모델에 트리거 : 해당 작업이 완료 뷰 모델WPF의 ViewModel에서의 비동기 UI 업데이트
private void SearchQuery(string query)
{
_redisModel.GetFriendsListAsync(query);
}
어떤 시점에서 GetFriendsListCompleted가 배경 스레드 notifing에 의해 호출됩니다. 이 시점에서 ListBox ItemSource를 업데이트해야합니다. 내가 업데이트하려고하면하지만 는 "다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수 없습니다"얻을 것입니다 나는 시도 Dispatcher.CurrentDispatcher.Invoke(), App.Current.Dispatcher.Invoke() 그리고 다른 마술,하지만 여전히 작동하지 않습니다.
ViewModel에 UI 디스패처를주고 그곳에서 호출하려고했습니다. 작동하지 않았습니다.
private string filterText = string.Empty;
public string FilterText
{
get { return filterText; }
set
{
filterText = value;
this.RaisePropertyChanged(() => this.FilterText);
this.FriendsList.View.Refresh(); // Here where exception is happening.
}
}
제가
Dispatcher.Invoke (DispatcherPriority.Normal 새로운 액션 ( () => this.FriendsList.View.Refresh()))이 줄을 변경하려고; - 여전히 똑같아.
Telerik ListBox를 사용하여 항목을 표시하고 있습니다. FriendList는 CollectionViewSource (http://www.telerik.com/help/wpf/radlistbox-overview.html)입니다. WPF 컨트롤 예제의 Telerik 예제를 사용할 때 작동합니다. 비동기 메서드를 사용할 때 문제가 발생하기 시작합니다. 보기의 형식은 System.ComponentModel.ICollectionView이며 필터링 및 그룹화에 사용됩니다.
ObservableCollection을 ListBox의 Items 속성에 할당하려고 시도했으나 작동하지 않습니다. 그것은 여기에 끝납니다 (전화의 모든 체인 후) 결국 :
A는 더 _redisModel.GetFriendsListAsync가 작동하는 방법에 대한 자세한 내용을 비트 뷰 모델에서
public GetAsyncResult(Func<T> workToBeDone, Action<IAsyncResult> cbMethod, Object state)
{
_cbMethod = cbMethod;
_state = state;
QueueWorkOnThreadPool(workToBeDone);
}
ThreadPool.QueueUserWorkItem(state =>
{
try
{
_result = workToBeDone();
}
catch (Exception ex)
{
_exception = ex;
}
finally
{
UpdateStatusToComplete(); //1 and 2
NotifyCallbackWhenAvailable(); //3 callback invocation
}
});
내가 가진 방법 :
private void GetFriendsListCompleted(object sender, ResultsArgs<Friend> e)
{
if (!e.HasError)
{
var curr = e.Results;
if (curr != null)
{
this.FriendsList= new CollectionViewSource();
this.FriendsList.Source = list;
this.FriendsList.Filter += this.FriendFilter;
FilterText = "";
Dispatcher.Invoke(DispatcherPriority.Normal, new Action(
() => this.FriendsList.View.Refresh()));
}
}
아무도 도와 주실 수 있습니까? 감사합니다.
@Robert Kruszewski – LucasSeveryn
편집 질문을 업데이트하고 귀하의 질문에 어떤 컨텍스트를 추가 할 수 있습니다. 'FriendsList'의 종류는 무엇입니까? VM에서 접근하는'View' 속성은 무엇입니까? – Viv