Windows 运行时中的意外多线程

Unintentional Multi-threading in Windows Runtime

我正在使用保存设置的 SettingsPane,我的所有问题都已解决 - 除了一件事我显然无法控制。

这是相关的 SettingsPane.xaml:

<ComboBox Name="Themes" SelectionChanged="SettingSelectionChanged">
    <ComboBoxItem Content="Theme 1" />
    <ComboBoxItem Content="Theme 2" />
    <ComboBoxItem Content="Theme 3" />
</ComboBox>

这是我的 SettingsPane.xaml.cs:

public Settings()
{
    this.InitializeComponent();
    this.DataContext = MainPage.Data;
    Themes.SelectedIndex = 0;
}

private void SettingSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ApplicationData.Current.RoamingSettings.Values["Theme"] = Themes.SelectedIndex;
    ApplicationData.Current.SignalDataChanged();
}

我处理 MainPage.xaml.cs 中的 SignalDataChanged() 电话:

public static MainPageVM Data = new MainPageVM();

public MainPage()
{
    Windows.Storage.ApplicationData.Current.DataChanged += (a, o) =>
    {
        Data.Theme = (int) Windows.Storage.ApplicationData.Current.RoamingSettings.Values["Theme"];
    };
}

Theme 存储在 MainPageVM.cs:

private int _theme = 0;
public int Theme
{
    get { return _theme; }
    set
    {
        if (value == _theme) return;
        _theme = value;
        OnPropertyChanged();
    }
}

现在,绑定如下:

<Grid Background="{Binding Theme, Converter={StaticResource ThemeToBackground}}" Name="MainGrid">

除了一件事,它似乎在工作。当它遇到 Theme 的 setter 中的 OnPropertyChanged() 调用时,它崩溃并出现此错误:

Additional information: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

我该怎么办?

每个 window 都有一个与之关联的不同线程;如果涉及数据绑定,您应该避免从另一个页面引用一个页面的视图模型(您将需要一个适配器将更改推送到正确的线程)。 [编辑] 此外,该特定事件正在与任何页面无关的线程上引发。