0

私のアプリケーションは、ユーザーがお互いにファイルをダウンロードできるようにする基本的なダウンロードアプリです(非常に基本的なカザー:-))

ダウンロードごとにプログレスバーが表示され、実際のダウンロードの進行状況に応じて更新する必要があります。

progressプロパティを保持するdownloadInstanceオブジェクトを保持するobservablecollectionがあります。

プログレスプロパティを更新すると、observablecollection変更イベントが発生しない可能性があり、プログレスバーは視覚的な進行なしで表示されたままになります。

これが私のthreadsaveobservablecollectionクラスです

public class ThreadSafeObservableCollection<T> : ObservableCollection<T>
{
    public override event NotifyCollectionChangedEventHandler CollectionChanged;

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        NotifyCollectionChangedEventHandler CollectionChanged = this.CollectionChanged;
        if (CollectionChanged != null)
            foreach (NotifyCollectionChangedEventHandler nh in CollectionChanged.GetInvocationList())
            {
                DispatcherObject dispObj = nh.Target as DispatcherObject;
                if (dispObj != null)
                {
                    Dispatcher dispatcher = dispObj.Dispatcher;
                    if (dispatcher != null && !dispatcher.CheckAccess())
                    {
                        dispatcher.BeginInvoke(
                            (Action)(() => nh.Invoke(this,
                                new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset))),
                            DispatcherPriority.DataBind);
                        continue;
                    }
                }
                nh.Invoke(this, e);
            }
    }

}

これは初期化プロセスです

uploadActiveInstances = new ThreadSafeObservableCollection<instance>();
instance newInstance = new instance() { File = file, User = user };
uploadActiveInstances.Add(newInstance);

そして最後にこれが私のインスタンスクラスです

public class instance
{
    public FileShareUser User { get; set; }
    public SharedFile File { get; set; }
    public int Progress { get; set; }
}

インスタンスのプロパティが変更されたら(progress ++)、どうすれば変更イベントを発生させることができますか?

4

2 に答える 2

1

ObservableCollectionは、ITが変更されたとき(たとえば、アイテムが追加/削除されたとき)にイベントを発生させますが、保持しているアイテムが変更されたときは発生しません。

アイテムが変更されたときにイベントを発生させるには、instanceクラスがインターフェースを実装する必要がありINotifyPropertyChangedます。

例えば:

public class instance : INotifyPropertyChanged
{
    private int progress;
    public int Progress 
    {
        get { return progress; }
        set
        {
            if (progress != value)
            {
                progress = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Progress"));
                }
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    /* Do the same with the remaining properties */
    public string User { get; set; }
    public string File { get; set; }

}

進行状況を変更すると、UIで更新されることがわかります。上記のコードでは、または
のPropertyChangedイベントを発生させないため、変更してもUIで更新されません。UserFile

于 2012-11-17T10:38:00.790 に答える
0

Observablecollectionは、アイテムが追加または削除されているときにのみビジュアルツリーを更新します。そのため、アイテムの値を変更しても、再レンダリングされません。

Progressプロパティを依存関係プロパティに変更し、プログレスバーの「Value」プロパティをバインドするか、INotifyPropertyChangedインターフェイスを実装します

于 2012-11-17T10:38:53.583 に答える