2011-11-18 121 views
1

我有ObservableCollection和WPF列表框相互綁定。 我想在添加ObservableCollection時同時在Listbox上顯示芯片位置。ObservableCollection和WPF列表框綁定

<Window x:Class="Apeiron.ZoneSetter.ZoneSetterWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
     Height="765" Width="765"> 
     <Grid>     
      <ListBox Name="lbPosList" ItemsSource="{Binding }" ></ListBox> 
     </Grid> 
</Window> 

案例1)它運作良好。當ObservableCollection被改變時,它在ListBox顯示chnaged芯片pos。

public partial class ZoneSetterWindow : Window, INotifyPropertyChanged 
    { 
    public ZoneSetterWindow() 
    { 
     InitializeComponent(); 
     lbChipList.DataContext = SelectedZoneChipList;    
    } 

    public void AddChip(ZoneMapChipInfo chip) 
    { 
      if (!m_SelectedChipDic.ContainsKey(chip.Point)) 
     { 
      m_SelectedChipDic.Add(chip.ChipPos, chip);     
      m_selectedzonechiplist.Add(chip); 
     } 
    } 


    private Dictionary<Point, ZoneMapChipInfo> m_SelectedChipDic = new Dictionary<Point, ZoneMapChipInfo>(); 

    private ObservableCollection<ZoneMapChipInfo> m_selectedzonechiplist = new ObservableCollection<ZoneMapChipInfo>(); 
    public ObservableCollection<ZoneMapChipInfo> SelectedZoneChipList 
    { 
     get 
     { 
      return m_selectedzonechiplist; 
     } 

    }  

    } 

案例2)它不起作用。儘管ObservableCollection已更改,但它不會在ListBox中顯示chnaged芯片pos。

public partial class ZoneSetterWindow : Window, INotifyPropertyChanged 
{ 
    public ZoneSetterWindow() 
    { 
     InitializeComponent(); 
     lbChipList.DataContext = SelectedZoneChipList;    
    } 

    public void AddChip(ZoneMapChipInfo chip) 
    { 
      if (!m_SelectedChipDic.ContainsKey(chip.Point)) 
     { 
      m_SelectedChipDic.Add(chip.ChipPos, chip);     
      m_selectedzonechiplist.Add(chip); 
     } 
    } 


    private Dictionary<Point, ZoneMapChipInfo> m_SelectedChipDic = new Dictionary<Point, ZoneMapChipInfo>(); 

    private ObservableCollection<ZoneMapChipInfo> m_selectedzonechiplist = new ObservableCollection<ZoneMapChipInfo>(); 
    public ObservableCollection<ZoneMapChipInfo> SelectedZoneChipList 
    { 
     get 
     { 
      ObservableCollection<WaferZoneMapChipInfo> result = new ObservableCollection<WaferZoneMapChipInfo>(); 
      foreach (ZoneMapChipInfo info in m_SelectedChipDic.Values) 
      { 
       result.Add(info); 
      } 
      return result; 
     } 

    }  

} 

我要同步m_SelectedChipDic和SelectedZoneChipList總是 並在列表框中顯示SelectedZoneChipList的ChipPosition。

我不知道以上兩種情況有什麼不同。

是否有人瞭解我有關上述問題。謝謝!!

回答

1

您的問題是,在您的第一個方法SelectedZoneChipList返回m_selectedzonechiplist列表視圖然後綁定到該列表視圖。這就是爲什麼當您向該列表添加內容時它正在更新UI。在第二種方法中,SelectedZoneChipList返回與m_selectedzonechiplist無關的全新列表。所以當你添加一些東西到m_selectedzonechiplist時,什麼都不會發生,因爲ListBox被綁定到一個完全不同的對象。

這樣的到ListBox綁定的工作大致爲:

  1. 的UI得到DataContext一旦當它建立的綁定。
  2. 它訂閱CollectionChanged更改的事件處理程序(其中ObservableCollection實現)。
  3. 每次更改集合時,都會引發UI反應的事件。

更新:在問候I want to synchronize m_SelectedChipDic and SelectedZoneChipList always:你可以擺脫ObservableCollection的,使您的m_SelectedChipDicObservableDictionary和綁定你ListView到一個代替。

+0

非常感謝!你的答案有助於我理解ObservableCollection。我會試試看。 ObservableDictionary!順便說一下,ObservableDictionary的哪一項被綁定?關鍵或價值? – Jini

+0

我會研究你的網頁的內容。謝謝! – Jini

相關問題