2013-04-03 110 views
2

在我的主窗口中,我有一個存儲所有數據的類(稱爲「Measconsettings」)。這個類(「Measconsettings」)包含另一個類「DeviceDefinition」的ObservableCollection「DeviceDefinitionList」添加項目後組合框不刷新C#WPF

ObservableCollection<DeviceDefinition> DeviceDefinitionList

當我在我的MainWindow中按下按鈕時,會創建一個帶有datacontex = Measconsettings的新窗口。

在這個新窗口中有一個ItemsSource綁定到「Measconsettings.DeviceDefinitionList」的組合框。現在

<ComboBox Grid.Row="2" Grid.Column="2" Margin="2,0" Name="CboDeviceDefinitionList" ItemsSource="{Binding Path=DeviceDefinitionList}"/> 

我的問題是,當加入一個項目的組合框不更新全自動。

我需要關閉新窗口並再次按下按鈕才能打開它,然後才顯示組合框中的項目。

我嘗試添加CboDeviceDefinitionList.Items.Refresh();但只有當我將項目添加到的ObservableCollection那麼他們出現的時候了之後添加CboDeviceDefinitionList.ItemsSource = orgMeasConSettings.DeviceDefinitionList;它不工作..

有關如何正確綁定到組合框的任何想法或提示? PS:我是WPF初學者

+2

你需要實現 「INotifyPropertyChanged的」 您的ObservableCollection那麼它應該工作。 –

+0

它正在更新,如果你使用CboDeviceDefinitionList.Items.Refresh();向集合中添加新項目後。 –

+0

@FarhadJabiyev不,但在Measconsetting類上實現INotifyPropertyChanged後,它可以工作。 – Enrico

回答

2

這是我的解決方案,按照manish的建議實現INotifyPropertyChanged之後。

編輯:它現在的作品!

public class MeasConSettings : INotifyPropertyChanged 
    { 

private ObservableCollection<DeviceDefinition> mDeviceDefinitionList; 
private DeviceDefinition mSelectedDeviceDefinition; 

    public ObservableCollection<DeviceDefinition> DeviceDefinitionList 
    { 
     get 
     { 
      return mDeviceDefinitionList; 
     } 
     set 
     { 
      mDeviceDefinitionList = value; 
     } 
    } 

    public DeviceDefinition SelectedDeviceDefinition 
     { 
      get 
      { 
       return mSelectedDeviceDefinition; 
      } 
      set 
      { 
       mSelectedDeviceDefinition = value; 
       NotifyPropertyChanged("SelectedDeviceDefinition"); 
      } 
     } 


    public event PropertyChangedEventHandler PropertyChanged; 

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

} 

XAML代碼:

<ComboBox Grid.Row="2" Grid.Column="2" Margin="2,0" Name="CboDeviceDefinitionList" ItemsSource="{Binding Path=DeviceDefinitionList}" SelectedItem="{Binding Path=SelectedDeviceDefinition}"/> 

代碼添加項目:

orgMeasConSettings.DeviceDefinitionList.Clear(); 
      foreach (DeviceDefinition deviceDefinition in newSettings.DeviceDefinitionList) 
      { 
       orgMeasConSettings.DeviceDefinitionList.Add(deviceDefinition); 
      } 

      orgMeasConSettings.SelectedDeviceDefinition = newSettings.DeviceDefinitionList.FirstOrDefault(); 
+1

這個解決方案是否有效? –

+0

@DanPuzey是的,現在把它添加到答案中。 – Enrico

+0

+1爲你的愛 –