1

ObvservableCollection で変更した値に ListView を変更しようとしています。

私は現在これを使用しており、コレクションをListViewにバインドしています

private ObservableCollection<Task> _tasks = TaskInit.TaskCollection;
        /// <summary>
        /// Observable Collection to hold all tasks
        /// </summary>
        /// 

        public ObservableCollection<Task> TasksCollection
        {
            get { return _tasks; }
            set
            {
                _tasks = value;
                NotifyPropertyChanged("TasksCollection");
            }
        }

問題は、次のコードを使用する場合です。

TaskInit.TasksCollection[2].TaskNumber = "hi";

値は変更されているはずですが、以前と同じままです。

誰かが私が作ったかもしれない問題を指摘できますか?

xaml の最初の行は次のとおりです。

<ListView SelectionMode="Single" ScrollViewer.CanContentScroll="True" x:Name="listTasks" Margin="0,0,0,35" Background="{x:Null}" BorderBrush="{x:Null}" ItemsSource="{Binding TasksCollection, Mode=TwoWay}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" BorderThickness="0" FontFamily="Myriad Pro" Foreground="{x:Null}" IsSynchronizedWithCurrentItem="True">

タスク クラス:

public class Task : INotifyPropertyChanged
    {
        /// <summary>
        /// 
        /// </summary>
        public string Module { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string FirstValue { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string SecondValue { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string ThirdValue { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public int Minutes { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string TaskNumber { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string Story1 { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string Story2 { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string Story3 { get; set; }

        /// <summary>
        /// 
        /// </summary>
        public string NetworkAdapter { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
4

1 に答える 1

7

ObservableCollectionは、アイテムがコレクションに追加またはコレクションから削除された場合を処理しますが、コレクション内のアイテムのプロパティが変更された場合は処理しません。MSDNによる: アイテムが追加、削除されたとき、またはリスト全体が更新されたときに通知を提供する動的データコレクションを表します。

TaskクラスがINotifyPropertyChangedインターフェイスを実装し、TaskNumberプロパティが変更されたときにPropertyChangedイベントを発生させることを確認する必要があります。

 private string _taskNumber;
 public string TaskNumber
 {
     get { return _taskNumber; }
     set
     {
         if(_taskNumber!= value)
         {
            _taskNumber= value;
            OnPropertyChanged("TaskNumber");
         }
     }
 }

TaskクラスはINotifyPropertyChangedを実装しますが、プロパティの値が変更されたときに実際にPropertyChangedイベントを発生させることはありません。各プロパティが変更された場合は、手動でOnPropertyChangedを呼び出す必要があります。これは自動的には行われません。

于 2012-08-09T22:04:21.603 に答える