通知属性对象更新后已更改



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

这是我的代码:

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

如何强制更新可观察集合中对象的绑定?

这是我的用户控制.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>

如果您反对实现 INotifyPropertyChanged,您可以将绑定设置为 null,然后重新绑定,但这不是我推荐的。

请参阅此答案以通知所有

通知视图模型的所有属性已更改

除非您更改所有属性,否则我会选择Miklos的答案。 通知属性已更改存在开销。

推荐模式

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新