2010-05-20 80 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