0

リストビューをエレガントな方法で更新したいと考えています。

これは私のコードです:

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>
4

2 に答える 2

4

INotifyPropertyChanged の実装に反対する場合は、バインディングを null に設定してから再バインドできますが、それはお勧めできません。

すべてに通知するには、この回答を参照してください

ビューモデルのすべてのプロパティに通知する変更されました

すべてのプロパティを変更しない限り、Miklos からの回答を使用します。NotifyPropertyChanged にはオーバーヘッドがあります。

推奨パターン

   private string prop1

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

はい、コード行ですが、UI は変更されたものだけを描画します。

あなたの質問とコメントの更新を見ました。
ALL への更新は、各プロパティへの更新です。
UI はプロパティ レベルで通知を受け取ります。
5 つのプロパティしかありません。

于 2012-09-20T13:23:56.343 に答える
2

クラスはインターフェースTrackを実装する必要がありINotifyPropertyChangedます。

通知を送信するすべてのプロパティのセッターPropertyChangedでイベントを発生させます(新しい値を設定した後)。

于 2012-09-20T13:07:27.767 に答える