2012-08-09 91 views
0

我想让ListView更改为我在ObvservableCollection中修改的任何值。UI不类似ObservableCollection

我目前使用这和收藏结合我的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)); 
     } 
    } 

回答

6

一个ObservableCollection将处理其中项目被添加或从集合中删除的情况下,但它不会处理集合中的项目属性发生变化的情况。 As per MSDN:表示动态数据集合,用于在项目添加,删除或整个列表刷新时提供通知。

你需要确保你的任务类实现INotifyPropertyChanged接口,和火灾的PropertyChanged事件时,其TaskNumber属性更改:

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

你的任务类实现INotifyPropertyChanged,但它从来没有真正触发的PropertyChanged事件当其属性的值发生变化时。您需要在每个属性更改时手动调用OnPropertyChanged - 它不会自动发生。

+0

对不起,我有点困惑,就在你展示的'public string task'部分。我用我的任务类更新了我的问题。 – 2012-08-09 22:07:25

+0

看我的编辑。你的TaskNumber属性应该看起来像这样。 – 2012-08-09 22:10:39

+0

完美工作,从来不知道这是一个简单的修复。谢谢 – 2012-08-10 08:18:00