背景,来自MSDN:
只会引发
ObservableCollections
CollectionChanged
事件 当ObservableCollection
的属性发生变化时(添加, 当现有元素的属性发生变化时,删除元素)和不。
Bummer ,因为我需要在现有元素的特定属性发生更改时更新UI。我尝试触发CollectionChanged
个事件和PropertyChanged
事件,但都没有效果。
我的情况:
在我的应用程序中,我有listbox
绑定到observablecollection
,其中项目的可见性取决于使用BoolToVisibilityConverter
的每个项目的“收藏夹”属性。 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属性值的更改不会导致项目显示或从收藏夹列表框中消失,这是因为帖子开头所述的原因所需。这是预料之中的。
要解决这个问题,我已尝试触发CollectionChanged
事件和PropertyChanged
事件,当更改收藏夹属性以使UI更新时,但两者都没有工作,我很困惑为什么不这样做。通过添加和删除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.
}
}
为什么不发射事件有效? 非常感谢提前。
答案 0 :(得分:2)
您的FeedItem类必须实现INotifyPropertyChanged接口,您的收藏夹属性必须如下所示:
私人布尔_收藏;
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");
}
}