Я использовал Reflector, чтобы найти источник этого исключения. В ListPicker.cs следующий метод переопределен.
protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e)
В этом методе следующая строка вызовет исключение, если SelectedItem установлен, а SelectedIndex равен -1 (что не происходит, если он не установлен перед загрузкой). Если SelectedItem не установлен, эта строка никогда не достигается (следовательно, не исключение).
else if (!object.Equals(base.get_Items().get_Item(this.SelectedIndex), this.SelectedItem))
Чтобы обойти это (пока они не исправят это), у меня есть несколько предложений.
Обходной путь 1
Если вы знаете начальный индекс, который будет создан привязкой TwoWay, то вы также можете установить свойство SelectedIndex, и привязка TwoWay будет работать
<toolkit:ListPicker x:Name="WeekStartDay"
Header="Week begins on"
SelectedItem="{Binding Source={StaticResource AppSettings},
Path=WeekBeginsSetting,
Mode=TwoWay}"
SelectedIndex="1">
<sys:String>monday</sys:String>
<sys:String>sunday</sys:String>
</toolkit:ListPicker>
Обходной путь 2
Используйте событие Loaded и установите вместо него Binding
<toolkit:ListPicker x:Name="WeekStartDay"
Header="Week begins on"
Loaded="WeekStartDay_Loaded">
<sys:String>monday</sys:String>
<sys:String>sunday</sys:String>
</toolkit:ListPicker>
private void WeekStartDay_Loaded(object sender, RoutedEventArgs e)
{
Binding binding = new Binding();
binding.Source = this.Resources["AppSettings"] as ApplicationSettings;
binding.Path = new PropertyPath("WeekBeginsSetting");
binding.Mode = BindingMode.TwoWay;
WeekStartDay.SetBinding(ListPicker.SelectedItemProperty, binding);
}