2010-05-20 77 views
1

我有一个可观察的集合绑定到WPF中的列表框。窗口中的一个选项是使用OpenFileDialog将项目添加到具有特定属性的列表框中。当我使用OpenFileDialog时,它立即设置可观察集合中新项目的两个属性。我正在使用INotifyPropertyChanged更新列表框。这两个新属性设置正确,现在列表框应显示新标题属性中包含的标题,并且绑定到列表框的标题文本框也应显示新标题。但是,在OpenFileDialog关闭时不会显示新标题,并且当我单击列表框中的另一个项目并返回到刚刚更改的项目时,它会更新标题文本框,但列表框中显示的标题不会更改,直到我将该项目移动到我想要更改的列表框中。WPF绑定不会更新,直到另一个动作

这里是绑定代码。

ItemsSource="{Binding Path=MyData, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

这里是浏览按钮的不工作的实施(L1是列表框)

 private void browse_Click(object sender, RoutedEventArgs e) 
    { 
     OpenFileDialog opf = new OpenFileDialog(); 
     opf.ShowDialog(); 
     MyData[L1.SelectedIndex].Title = System.IO.Path.GetFileNameWithoutExtension(opf.FileName); 
     MyData[L1.SelectedIndex].Command = opf.FileName; 
    } 

当我只需在文本框中输入,然后点击了出来它更新列表我立即添加了新的信息。我还有一个创建新按钮,点击它后,它立即向列表框中添加一个新项目并更新其属性。唯一没有正确更新的是我给你的代码。谢谢你的帮助。

编辑:

这是我实现INotifyPropertyChanged的

private OCLB _MyData; 
    public OCLB MyData 
    { 
     get 
     { 
      return _MyData; 
     } 

     set 
     { 
      _MyData= value; 
      FirePropertyNotifyChanged("MyData"); 
     } 
    } 

OCLB是观察集合。下面是函数FirePropertyNotifyChanged

public event PropertyChangedEventHandler PropertyChanged; 

    private void FirePropertyNotifyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

每个这些是在部分类主窗口为WPF形式。我还有一个存储在OCLB(可观察集合)中的MyData文件的类(带有4个get/set函数)。还有一个功能为OCLB的类。

回答

4

我想你在这里看到的是,ObservableCollection不会触发集合中某个项目的PropertyChanged事件。父窗体没有收到任何通知,直到您滚动到有问题的项目。

您的新按钮正在工作的原因是将一个新项目添加到引发ObservableCollection上的CollectionChanged事件的集合中。

为了让您的收藏更新,您需要对收藏中的物品实施适当的属性更改机制。例如,如果您正在创建ObservableCollection<MyDataItem>,MyDataItem需要正确实现INotifyPropertyChanged。

希望帮助,

+0

我已经加入我的实现INotifyPropertyChanged的,以我原来的问题,所以我现在能发现什么是错的。 – mjstide 2010-05-20 14:34:25

+0

MyData似乎是您的收藏。包含属性“标题”和“命令”的类需要INotifyPropertyChanged处理。 – SergioL 2010-05-20 14:44:09

+0

我将一个XML反序列化为一个容器。该容器是MyData。 MyData是一个ObservableCollection 。 MyClass包含标题和命令属性。你是否说我需要将INotifyPropertyChanged函数放入MyClass中?或者我需要更改为INotifyCollectionChange? – mjstide 2010-05-20 15:14:07