即使触发了CollectionChanged或PropertyChanged事件,UI也没有更新



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

相关内容

  • 没有找到相关文章

最新更新