Background, from MSDN:
ObservableCollections
CollectionChanged
事件只会被引发当ObservableCollection
的性质发生变化时(添加,
很糟糕,因为我需要在现有元素的特定属性更改时更新UI。我试着发射CollectionChanged
事件和PropertyChanged
事件,但都没有工作。
我的情况:
在我的应用程序中,我有一个listbox
绑定到一个observablecollection
,其中项目的可见性取决于使用BoolToVisibilityConverter
的每个项目的"Favorite"属性。XAML:
<ListBox x:Name="FavoritesListBox"
Margin="0,0,-12,0"
ItemsSource="{Binding FeedItemOCollection}"
SelectionChanged="FavoritesListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Name="FavoritesStackPanel"
Margin="0,0,0,17" Visibility="{Binding Favorite, Converter={StaticResource BooltoVisibilityConverter}}">
<TextBlock Text="{Binding Title}"
TextWrapping="Wrap"
Margin="12,0,0,0"
Style="{StaticResource PhoneTextLargeStyle}" />
<TextBlock Text="{Binding PublishDate,Converter={StaticResource DateTimeToDateConverter}}"
TextWrapping="Wrap"
Margin="12,-6,12,0"
Style="{StaticResource PhoneTextSmallStyle}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
注意:该对象在App.Xaml.cs中初始化,因此在整个应用程序中是全局的。这可能是不寻常的事情,导致事情不为我工作
一旦初始绑定发生,更改元素的Favorite属性的值不会导致项目从Favorites列表框中显示或消失,这是由于文章开头所指出的原因。这是意料之中的。
为了解决这个问题,我试着在最喜欢的属性被改变以获得UI更新时触发CollectionChanged
事件和PropertyChanged
事件,但都没有工作,我很困惑为什么不。我已经成功地解决了我的问题,通过添加和从ObservableCollection
中删除元素,但显然这是一个黑客。代码:
public void MarkFavorite(FeedItem feedItem)
{
try
{
feedItem.Favorite = true;
//CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); <-- why doesn't this work?
//PropertyChanged(this, new PropertyChangedEventArgs("Count")); <-- why doesn't this work?
this.Remove(feedItem); <-- this works, but is a hack
this.Add(feedItem); <-- this works, but is a hack
SaveToIso();
}
catch (Exception exception)
{
//TODO: Log this.
}
}
为什么不能触发事件?提前感谢你。
你的FeedItem类必须实现INotifyPropertyChanged接口,并且你的Favorite属性必须看起来像:
private bool _Favorite;
private bool _Favorite;
public bool Favorite
{
get { return _Favorite; }
set
{
_Favorite = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Favorite"));
}
}
或者你可以提取一个方法
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
和你的属性看起来像这样:
private bool _Favorite;
public bool Favorite
{
get { return _Favorite; }
set
{
_Favorite = value;
OnPropertyChanged("Favorite");
}
}