我正在使用保存设置的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">
除了一件事,它似乎有效。当它在OnPropertyChanged()
的setter中遇到Theme
来电时,会因此错误而崩溃:
附加信息:该应用程序称为为不同线程编组的接口。 (来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))
我该怎么办?
答案 0 :(得分:1)
每个窗口都有一个与之关联的不同线程;如果涉及数据绑定,您应该避免从另一个页面引用一个页面的视图模型(您需要一个将更改推送到正确线程的适配器)。 [编辑]此外,在与任何页面无关的线程上引发该特定事件。