0

모든 휴대용 클래스 라이브러리를 대상으로하는 MVVM Light 인프라가 있습니다 .Net 4, SL5, Win 8, WP 8.1, WPSL 8, Xamarin.Android 및 Xamarin.iOS. 이것은 WPF 클라이언트와 완벽하게 작동하지만, Windows Store App/Win 8 환경에서 사용하려고하면 약간의 저항에 맞서 있습니다. 첫 번째 문제는 App.xaml에서 발견된다 :휴대용 클래스 라이브러리 - Windows 저장소 응용 프로그램 : "파일 또는 어셈블리 Microsoft.Threading.Task를로드 할 수 없습니다"

내가 할 디자인 타임에
<Application 
x:Class="Win8Client.App" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:vm="using:INPS.Vision.Appointments.Shared.ViewModels" 
xmlns:local="using:Win8Client"> 

<Application.Resources> 
    <vm:ViewModelLocator x:Key="Locator" /> 
</Application.Resources> 

</Application> 

"파일이나 어셈블리 'Microsoft.Threading.Tasks'를로드 할 수 없습니다, 버전 = 1.0.12.0 ..."에 어떤을 언급하고 내 ViewModelLocator. 이 컴파일 및 확인을 실행하려면 나타납니다하지만 모든 디자인 시간 데이터를 가져 오지 않습니다. 디자인 타임 데이터 WPF 클라이언트에서 제대로 작동합니다.

일단이 라인이 호출되는 일단 내가 처음보기를 볼 수 있지만 실행 :
Slots = await _appointmentsDataProvider.GetAppointments(SelectedDate); 

나는 ViewModelBase의 MVVM 조명 설정 방법을 활용 내 슬롯 속성 세터에서 다음과 같은 예외를 얻을. Slots 속성은 아직 모든 UI에 바인딩되지 않습니다.

예외 :

슬롯 재산권 :

public List<Slot> Slots 
{ 
    get { return _slots; } 
    set 
    { 
     Set(SlotsPropertyName, ref _slots, value); // <-- Exception thrown here 
    } 
} 

가 실현 ". 응용 프로그램은 (0x8001010E (RPC_E_WRONG_THREAD) HRESULT에서 예외)를 다른 스레드 정렬 화 된 인터페이스를 소위"

나는 실제로 질문하지 않았다. 간단히 말해서, Windows Store App에서 MVVM Light를 사용하는 가장 좋은 방법은 무엇입니까?

도움이나 조언을 미리 보내 주셔서 감사합니다.

+0

어셈블리 로딩 오류는 다음을 시도하십시오. 모든 Microsoft.Bcl' NuGet 패키지를 제거하고'app.config'에서 모든 어셈블리 리디렉션을 제거한 다음 해당 패키지의 최신 버전을 설치하십시오. –

답변

1

첫 번째 문제 "파일 또는 어셈블리 'Microsoft.Threading.Tasks', 버전 = 1.0.12.0을로드 할 수 없습니다 ..."아직 해결하지 못했지만 때로는 설계 데이터가 표시됩니다. 매우 변덕 스럽습니다. ...

두 번째 문제 - WPF에서 "그냥 효과가 있습니다"라는 이유 때문에이 문제가 Windows 스토어 응용 프로그램에서만 작동한다고 가정했습니다. 잘못된. Windows Store 앱이 비동기/다르게 스레딩을 처리하는 것처럼 보입니다. 제 추측입니다.

수정 : 하나의 메소드 선언으로 PCL의 IDispatcherHelper 인터페이스를 만든이 :

void RunOnUIThread(Action action); 

그런 다음 각 플랫폼에 특정 프로젝트 IDispatcherHelper을 구현 (WPF/윈도우 8.1)에서 하나의 구체적인 DispatcherHelper 클래스를 만들었습니다. 각 구현은 MVVM 등을 호출

WPF 및 Windows 8.1에서 App.xaml.cs를에서
DispatcherHelper.CheckBeginInvokeOnUI(action); 

은 단순히 핸들로 IDispatcherHelper와 MVVM 조명 SimpleIoc와 구체적인 구현을 등록했다. 뷰 모델 내에서 인터페이스를 통해 플랫폼 특정 구현을 사용합니다.

var slots = await _appointmentsDataProvider.GetAppointments(SelectedDate); 
IDispatcherHelper dispatcherHelper = SimpleIoc.Default.GetInstance<IDispatcherHelper>(); 

dispatcherHelper.RunOnUIThread(() => 
{ 
    Slots = slots; 
}); 

추상화를 사랑하게 되었어요!

+0

크로스 스레드 예외는 백그라운드 스레드에서'Slots'을 업데이트하기 때문에 발생합니다. 따라서'async' /'await'와는 아무런 관련이 없습니다. WPF는 이것을 허용하는 특별한 논리를 가지고 있습니다. 다른 플랫폼에서는 그렇지 않습니다. 디스패처를 사용하는 것보다 항상 좋은 해결책이 있습니다. 보통 'await' 또는'Progress '은 문제를보다 우아하게 해결할 수 있습니다. –

+0

나는 원래 코드에서 기다릴 필요가 없다. 진행 을 살펴 보겠습니다. 감사. –