即使触发了CollectionChanged或PropertyChanged事件,UI也不会更新

时间:2011-11-06 19:22:14

标签: silverlight windows-phone-7 binding inotifypropertychanged

背景,来自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.
        }
    }

为什么不发射事件有效? 非常感谢提前。

1 个答案:

答案 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");
    }
}