【问题标题】:Notify PropertyChanged after object update对象更新后通知 PropertyChanged
【发布时间】:2012-09-12 20:25:54
【问题描述】:

我希望以优雅的方式更新我的列表视图。

这是我的代码:

ObservableCollection<Track> tracks = new ObservableCollection<Track>();
Track track = new Track();
Tracks.AddRange(track); // collection add a track, and list view updates too
Task.Factory.StartNew(() =>
    track.GetInfo(); // this operation might require some times to update
    // here I need to notify that my object is updated
);

如何强制更新 ObservableCollection 中的对象绑定?

这是我的 userControl.xaml

<UserControl.Resources>
    <local:TimeConverter x:Key="timeConverter" />
    <local:IndexConverter x:Key="indexConverter" />
    <CollectionViewSource x:Key="trackList" Source="{Binding Path=TrackList.Tracks}"/>
</UserControl.Resources>

<DockPanel LastChildFill="True">
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" Margin="2, 5, 2, 5">
        <Button Name="btn_addtrack" Command="{Binding AddTrack}" Content="+" />
    </StackPanel>
    <ListView Name="lv_tracklist" 
              DataContext="{StaticResource trackList}" 
              ItemsSource="{Binding}"
              >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="#" Width="20" DisplayMemberBinding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListViewItem}}, Converter={StaticResource indexConverter}}" />
                <GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}"/>
                <GridViewColumn Header="Artist" DisplayMemberBinding="{Binding Artist}"/>
                <GridViewColumn Header="Length" DisplayMemberBinding="{Binding Length, Converter={StaticResource timeConverter}}" />
                <GridViewColumn Header="Path" DisplayMemberBinding="{Binding Location}"/>
            </GridView>
        </ListView.View>
    </ListView>
</DockPanel>

【问题讨论】:

  • 您能否发布将ListView 绑定到tracks 集合的XAML?
  • Track 类是否实现了 INotifyPropertyChanged?可以发一些代码吗?
  • 不,Track没有实现INotifyPropertyChanged,反正我不需要通知每个单个属性的更新。我需要在调用 track.GetInfo(); 之后更新所有属性;以上
  • 您没有接受一个答案,并且根据您的 cmets,您至少有一个答案。你知道要检查答案吗?
  • 不幸的是,我的声望为

标签: wpf mvvm observablecollection inotifypropertychanged model-view


【解决方案1】:

如果您反对实现 INotifyPropertyChanged,您可以将绑定设置为 null 然后重新绑定,但我不建议这样做。

请参阅此答案以通知所有人

notify-all-properties-of-the-view-model-has-changed

除非您要更改所有属性,否则我会选择 Miklos 的答案。 NotifyPropertyChanged 有开销。

推荐模式

   private string prop1

   Public string Prop1
   {
        get { return prop1; }
        set 
        {
            if (prop1 == value) return;
            prop1 = value;
            NotifyProperyChanged("Prop1");
        }
   {

是的代码行,但 UI 只描绘了更改的内容。

我刚刚看到您的问题和评论的更新。
对 ALL 的更新是对每个属性的更新。
UI 在属性级别接收通知。
您只有 5 个属性。

【讨论】:

    【解决方案2】:

    您的Track 类需要实现INotifyPropertyChanged 接口。

    在您要发送通知的每个属性(设置新值之后)的设置器中引发PropertyChanged 事件。

    【讨论】:

    • 这有点泛泛地谈论行编码,确定不存在通知所有对象属性的整个更改的方法吗?
    • 您可以调用 OnNotifyPropertyChanged("") 强制所有绑定的属性重新验证。但是,数据上下文必须实现 INotifyPropertyChanged。
    • 好的,我决定为 Track 制作一个 ViewModel,然后我会尝试找出如何以更便宜的方式实现它。我会让你看到我的实现,然后我会放在这里。谢谢大家的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2022-06-13
    • 2011-12-20
    • 1970-01-01
    • 2011-10-21
    • 2014-03-13
    相关资源
    最近更新 更多