Emblem
に表示するタイプのオブジェクトのリストがありますLongListMultiSelector
。まだ達成されていないものだけを示したいと思います。1 つまたは複数の項目を選択して変更できますIsAchieved = true
が、問題はそれらがすぐに消えず、UI が自動的に更新されないことです。
を使っていたので問題ないと思いましたObservableCollection<T>
。その後、アイテムのプロパティが変更された場合、コレクションに通知されないことがわかりました。その結果、INotifyPropertyChanged
インターフェースを実装しましたが、これも機能しません。
ここSOで、この問題を共有する次の質問(およびその他)を見つけました:
- Item が変更されたときに ObservableCollection に通知する
- ObservableCollection がその中の項目が変更されたときに気付かない (INotifyPropertyChanged を使用しても)
- ObservableCollection 内のアイテムが変更されたかどうかを検出する方法
の使用法も実装しようとしましたTrulyObservableCollection<T>
が、結果もありませんでした。これが私が持っているものです
XAML コントロール:
<toolkit:LongListMultiSelector Name="EmblemsList"
ItemsSource="{Binding Emblems}"
Background="Transparent"
LayoutMode="List"
ItemTemplate="{StaticResource ItemTemplate}" />
アイテムは次の方法でバインドされますEmblemsViewModel
。
public class EmblemsViewModel
{
public EmblemsViewModel()
{
Emblems = new TrulyObservableCollection<Emblem>();
}
public TrulyObservableCollection<Emblem> Emblems { get; set; }
}
//Usage on the page
DataContext = new EmblemsViewModel { Emblems = DB.GetEmblems() }
クラスは次のEmblem
とおりです。
public class Emblem : Achievement
{
public int Level { get; set; }
}
public abstract class Achievement : INotifyPropertyChanged
{
private bool _isAchieved;
public string Description { get; set; }
public bool IsAchieved
{
get { return _isAchieved; }
set
{
if (_isAchieved != value)
{
_isAchieved = value;
NotifyPropertyChanged("IsAchieved");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
これが機能しない原因は何ですか?
アップデート:
CollectionViewSource
フィルタリングを適用するために を適用しましたが、アイテムが表示されません。
//Reference to the CollectionViewSource
_viewSource = (CollectionViewSource)Resources["EmblemsViewSource"];
//3 options in the ListBox: all, achieved & unachieved
private void FilterListBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
{
var selectedItem = ((ListBoxItem)FilterListBox.SelectedItem).Content.ToString();
switch (selectedItem)
{
case "achieved": _filter = Filter.Achieved; _viewSource.Filter += new FilterEventHandler(CollectionViewSource_Filter); break;
case "unachieved": _filter = Filter.Unachieved; _viewSource.Filter += new FilterEventHandler(CollectionViewSource_Filter); break;
default: _filter = Filter.All; _viewSource.Filter -= new FilterEventHandler(CollectionViewSource_Filter); break;
}
}
private void CollectionViewSource_Filter(object sender, FilterEventArgs e)
{
var item = e.Item as Emblem;
switch (_filter)
{
case Filter.Achieved: e.Accepted = item.IsAchieved; break;
case Filter.Unachieved: e.Accepted = !item.IsAchieved; break;
case Filter.All: e.Accepted = true; break;
}
}
XAML:
<CollectionViewSource x:Key="EmblemsViewSource" Source="{Binding Emblems}" />
<toolkit:LongListMultiSelector Name="EmblemsList"
ItemsSource="{Binding Source={StaticResource EmblemsViewSource}}"
Background="Transparent"
LayoutMode="List"
ItemTemplate="{StaticResource ItemTemplate}" />