Windows Phone 7アプリにListPickerがあり、ItemsSourceプロパティとSelectedIndexプロパティの両方がViewModelにバインドされています。SelectedIndexは双方向バインディングを使用しています。アイテムとSelectedIndexは、アプリケーションの起動時に正しく入力されます。ただし、ViewModelのSelectedIndexプロパティを変更すると、選択されたアイテムがないかのように、ListPickerのTextBoxが空白になります。フルモードに移行して、リストから選択されたアイテムを確認すると、正しいアイテムが選択されています。
ListPickerxamlコードは次のとおりです。
<toolkit:ListPicker Name="TheListPicker" ItemsSource="{Binding TheItems}" CacheMode="BitmapCache" FullModeHeader="{Binding Path=Resources.TheHeader, Source={StaticResource LocalizedStrings }}" SelectedIndex="{Binding TheCurrentIndex, Mode=TwoWay}" IsEnabled="{Binding IsViewEnabled}" TabIndex="0" >
<toolkit:ListPicker.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="{Binding Name}" FontFamily="{StaticResource PhoneFontFamilySemiBold}" FontSize="{StaticResource PhoneFontSizeMediumLarge}" />
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.ItemTemplate>
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<StackPanel x:Name="item" Orientation="Horizontal" Margin="5, 24, 0, 24">
<TextBlock Margin="15, 0, 0, 0" Text="{Binding Name}" FontSize="40" TextWrapping="Wrap" />
</StackPanel>
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</toolkit:ListPicker>
これは私のViewModelの簡略版です。
[DataMember]
public ObservableCollection<ItemEntity> TheItems
{
get
{
if (this.theItems == null)
{
this.theItems = new ObservableCollection<ItemEntity>();
}
return this.theItems;
}
set
{
this.theItems = value;
}
}
[DataMember]
public int TheCurrentIndex
{
get
{
return this.theCurrentIndex;
}
set
{
if (value != this.theCurrentIndex)
{
this.theCurrentIndex = value;
NotifyPropertyChanged("TheCurrentIndex");
NotifyPropertyChanged("IsSomeOtherPropertyEnabled");
}
}
}
そして、これがMainPage.xaml.csからの関連コードです(App_ViewModelChangedは、アプリケーションの起動時に実行された非同期処理が終了したときに呼び出されるイベントハンドラーです):
private void App_ViewModelChanged(object sender, ViewModelChangedEventArgs e)
{
BindToViewModel();
}
private void BindToViewModel()
{
this.DataContext = this.ViewModel;
this.ViewModel.IsViewEnabled = true;
}
private void SomeAsyncMethodCompleted(object sender, DetectCompletedEventArgs e)
{
if (e.Error == null)
{
this.ViewModel.TheCurrentIndex = e.Result;
}
}
この問題は常に発生しているわけではありません。50%の確率で発生します。これは、アプリケーションの存続期間中に1回だけ発生し、その後は二度と発生しないようです。また、この問題は、SilverlightControlToolkitの2011年2月のリリースから2011年8月のリリースに切り替えたときに発生し始めました。これまでこの問題が発生したことはありません。
これは既知の問題ですか?