我有一个可观察的集合绑定到WPF中的列表框。窗口中的一个选项是使用OpenFileDialog将项目添加到具有某些属性的列表框中。当我使用OpenFileDialog时,它立即设置了可观察集合中新项的两个属性。我正在使用INotifyPropertyChanged来更新列表框。这两个新属性设置正确,现在列表框应显示新标题属性中包含的标题,绑定到列表框的标题文本框也应显示新标题。但是,在OpenFileDialog关闭时都没有显示新标题,当我点击列表框中的另一个项目并返回到我刚刚更改的项目时,它会更新标题文本框,但列表框中显示的标题不会更改,直到我在列表框中移动我想要更改的项目。
这是绑定代码。
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表单的部分类MainWindow中。我还有一个存储在OCLB(可观察集合)中的MyData文件类(带有4个get / set函数)。还有一个具有OCLB功能的类。
答案 0 :(得分:4)
我认为你在这里看到的是ObservableCollection没有在你的集合中的一个项目上触发PropertyChanged事件。在您滚动到相关项目之前,父表单不会收到任何通知。
新按钮工作的原因是向集合中添加一个新项目,该项目将触发ObservableCollection上的CollectionChanged事件。
为了让您的集合更新,您需要在集合中的项目上实现合适的属性更改机制。例如,如果您要创建ObservableCollection<MyDataItem>
,MyDataItem需要正确实现INotifyPropertyChanged。
希望有所帮助,