その問題のために、私は誰もがこの動作を経験するための最小限のプロジェクトを作成しました。このように動作しているエンジンだけではないことを願っています。
私のプロジェクトでは、たくさんのサンプル データを含むリスト ボックスを実現しました。リストボックスには、各アイテムのチェックボックス要素もあります。
問題:まず、リストボックスのチェックボックスをチェック/チェック解除します。次に、リストボックスを数回スクロールします。多くのチェックボックスがランダムにチェック/チェック解除されていることに気付きました。ListBox を少し減らしても (ソース コードのコメントを参照)、奇妙な動作はありません。編集:: この問題がない場合は、リストの一番下にある項目をチェックしてみてください。問題を確認するには、さらにオブジェクトを追加してリストを拡張する必要があるかもしれません。
ここにいくつかのコードスニペットがあります。ご覧のとおり、Listbox の代わりに、List/ObservableCollection、PropertyChanged、および LongListSelector を使用して既に試しました。
C#
// Already tried to use simple List<SampleCheckedData> buildings.
// Doesnt change anything.
private ObservableCollection<SampleCheckedData> buildings;
// Already tried with this as well.
/*protected ObservableCollection<SampleCheckedData> Buildings
{
get
{
return buildings;
}
set
{
buildings = value;
}
}*/
public MainPage()
{
InitializeComponent();
buildings = new ObservableCollection<SampleCheckedData>();
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Drizzle", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Snow", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Drizzle", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Snow", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Drizzle", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Snow", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Drizzle", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Snow", IsChecked = false });
// If you comment this data out, the listbox is smaller and no problem occurs in my case.
buildings.Add(new SampleCheckedData() { Name = "Cloudy" , IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Drizzle", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Snow", IsChecked = false });
// If you comment this data out, the listbox is smaller and no problem occurs in my case. [END]
this.listBox2.ItemsSource = buildings;
}
私のチェック/チェック解除イベント:
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
//Use this if you use the LongListSelector.
//ListBoxItem checedItem = this.listBox2.SelectedItem as ListBoxItem;
ListBoxItem checedItem = this.listBox2.ItemContainerGenerator.ContainerFromItem((sender as CheckBox).DataContext) as ListBoxItem;
if (checedItem != null)
{
checedItem.IsSelected = true;
}
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
//Use this if you use the LongListSelector.
//ListBoxItem checedItem = this.listBox2.SelectedItem as ListBoxItem;
ListBoxItem checedItem = this.listBox2.ItemContainerGenerator.ContainerFromItem((sender as CheckBox).DataContext) as ListBoxItem;
if (checedItem != null)
{
checedItem.IsSelected = false;
}
}
そして私のサンプルデータクラス:
public class SampleCheckedData
{
//Already tried with this, but it is not working.
/*
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
if (_isChecked != value)
{
_isChecked = value;
NotifyPropertyChanged("IsChecked");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
*/
public bool IsChecked
{
get;
set;
}
public string Name
{
get;
set;
}
}
XAML
私のコンテンツは次のようになります。
<!--ContentPanel - zusätzliche Inhalte hier platzieren-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox x:Name="listBox2" SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
<TextBlock Text="{Binding Name}" Width="150" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--//Use this if you use the LongListSelector.-->
<!--<toolkit:LongListSelector x:Name="listBox2" Background="Transparent" IsFlatList="True" ItemTemplate="{StaticResource citiesItemTemplate}" />-->
</Grid>
LongListSelector で試してみたい場合はオプションです。
<DataTemplate x:Key="citiesItemTemplate">
<StackPanel Grid.Column="1" VerticalAlignment="Top">
<TextBlock Text="{Binding Name}" FontSize="26" Margin="12,-12,12,6"/>
<CheckBox IsChecked="{Binding IsChecked}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
</StackPanel>
</DataTemplate>
とxmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
誰かがこれを解決できることを願っています。手がかりは見つかりませんでした...
編集:
関連する問題:
編集:
この問題が発生するには、リストにさらにいくつかのオブジェクトを追加する必要があることに気付きました:
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Sun", IsChecked = false });
buildings.Add(new SampleCheckedData() { Name = "Cloudy", IsChecked = false });
.....
次に、リストの一番上または一番下にある項目を確認すると、問題が発生します。