我有一個對象的列表,類型Emblem
,我在LongListMultiSelector
中顯示。我只想展示那些還沒有實現的。我可以選擇一個或多個項目並將它們更改爲IsAchieved = true
,但問題是它們不會立即消失,UI不會自動更新。(真的)ObservableCollection <T>不更新UI
我認爲這不會是一個問題,因爲我使用了ObservableCollection<T>
。然後我發現如果一個項目的屬性發生變化,那麼這個集合就不會被通知。結果實現了INotifyPropertyChanged
接口,但這也不起作用。
在這裏,所以我發現以下問題(及以上)共享此問題:
- Notify ObservableCollection when Item changes
- ObservableCollection not noticing when Item in it changes (even with INotifyPropertyChanged)
- How to detect if an item in my ObservableCollection has changed
我也嘗試過推行的用法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}" />
您在哪裏篩選出XAML中IsAchieved = true的元素? – 2014-10-20 09:25:59
是那個實際的初始化代碼? – thumbmunkeys 2014-10-20 09:32:42
@OndrejSvejdar我沒有實現這一點。現在我有但沒有項目顯示。查看更新後的問題以獲取更多信息。 – Abbas 2014-10-20 10:47:48