我有一个MVVM Light基础架构,它都包含在一个可移植类库中,目标是.Net 4,SL5,Win 8,WP 8.1,WPSL 8,Xamarin.Android和Xamarin.iOS。这与WPF客户端完美配合,但是,当我尝试在Windows应用商店App / Win 8环境中使用它时,我遇到了一些阻力。第一个问题可以在App.xaml中找到:
<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>
在设计时我得到&#34;无法加载文件或程序集&#39; Microsoft.Threading.Tasks&#39;,version = 1.0.12.0 ...&#34;这是指我的ViewModelLocator。这编译并似乎运行正常,但我没有得到任何设计时数据。设计时数据在WPF客户端中运行良好。
一旦运行,我会看到我的第一个视图,但一旦调用此行:
Slots = await _appointmentsDataProvider.GetAppointments(SelectedDate);
我在我的slots属性的setter中获得了以下异常,它利用了ViewModelBase的MVVM Lights Set方法。 Slots属性尚未绑定到任何UI。
例外:
&#34;应用程序调用了为不同线程编组的接口。 (来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))&#34;
老虎机属性:
public List<Slot> Slots
{
get { return _slots; }
set
{
Set(SlotsPropertyName, ref _slots, value); // <-- Exception thrown here
}
}
意识到我实际上没有问过一个问题。简单地说,我想知道,将MVVM Light与Windows应用商店应用程序一起使用的最佳方法是什么?
提前感谢您的任何帮助或建议!
答案 0 :(得分:1)
第一个问题&#34;无法加载文件或程序集&#39; Microsoft.Threading.Tasks&#39;,version = 1.0.12.0 ...&#34;我还没有解决,但我不时会看到设计数据。看起来非常有气质......
第二个问题 - 我之所以有点因为是#34;刚刚工作了#34;在WPF中,我认为它只适用于Windows应用商店应用。错误。看起来Windows Store Apps处理异步/等待线程的方式不同 - 这是我的猜测。
修复:使用单个方法声明在PCL中创建了一个IDispatcherHelper接口:
void RunOnUIThread(Action action);
然后在每个特定于平台的项目(WPF / Windows 8.1)中创建了一个具体的DispatcherHelper类,它实现了IDispatcherHelper。每个实现只调用MVVM Lights:
DispatcherHelper.CheckBeginInvokeOnUI(action);
在WPF和Windows 8.1的App.xaml.cs中,我只使用IDispatcherHelper作为句柄注册了MVVM Lights SimpleIoc的具体实现。在视图模型中,我然后通过接口使用特定于平台的实现:
var slots = await _appointmentsDataProvider.GetAppointments(SelectedDate);
IDispatcherHelper dispatcherHelper = SimpleIoc.Default.GetInstance<IDispatcherHelper>();
dispatcherHelper.RunOnUIThread(() =>
{
Slots = slots;
});
喜欢抽象!