WPF绑定直到另一个操作后才更新

时间:2010-05-20 14:07:36

标签: c# wpf listbox binding inotifypropertychanged

我有一个可观察的集合绑定到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功能的类。

1 个答案:

答案 0 :(得分:4)

我认为你在这里看到的是ObservableCollection没有在你的集合中的一个项目上触发PropertyChanged事件。在您滚动到相关项目之前,父表单不会收到任何通知。

新按钮工作的原因是向集合中添加一个新项目,该项目将触发ObservableCollection上的CollectionChanged事件。

为了让您的集合更新,您需要在集合中的项目上实现合适的属性更改机制。例如,如果您要创建ObservableCollection<MyDataItem>,MyDataItem需要正确实现INotifyPropertyChanged。

希望有所帮助,