2012-02-21 106 views
0

我試圖編程添加項目到WPF中的ListView。我做了大量的閱讀(包括一些問題),並認爲我做得正確,但是項目沒有顯示出來。據我瞭解,我創建ListViewe並將其綁定到數據源,在這種情況下是一個ObservableCollection。我已經驗證ObservableCollection獲取項目添加到它,但它們不會顯示在ListView上。如果它很重要,那麼在我運行LINQ查詢並嘗試向其中添加項目時,ListView已經實例化。動態添加項目到WPF列表視圖

這裏是定義列表視圖中的XAML:

<TabPanel Name="ResultsTab" Height="200" Width ="500" DockPanel.Dock="Top" HorizontalAlignment="Left"> 
     <TabItem Name="Default_Tab" Header="Default"> 
      <ListView Name="DefaultListView" ItemsSource="Binding FCPortCollection"> 
       <ListView.View> 
        <GridView x:Name="DefaultGridView"> 
         <GridViewColumn Width="Auto" Header="FC Port" DisplayMemberBinding="{Binding Path=FCPort}" /> 
         <GridViewColumn Width="Auto" Header="WWPN" DisplayMemberBinding="{Binding Path=WWPN}"/> 
         <GridViewColumn Width="Auto" Header="FCID" DisplayMemberBinding="{Binding Path=FCID}" /> 
         <GridViewColumn Width="Auto" Header="SwitchName" DisplayMemberBinding="{Binding Path=SwitchName}"> 
         </GridViewColumn>     
        </GridView> 
       </ListView.View>  
      </ListView> 
     </TabItem> 

這裏是應該載入它的代碼。

public class PortResult 
{ 
    public string SwitchName; 
    public string FCPort; 
    public string FCID; 
    public string WWPN; 

    public PortResult(string name, FCPort port) 
    { 
     SwitchName = name; 
     FCPort = String.Format("fc{0}/{1}", port.SlotNum, port.PortNum); 
     WWPN = port.WWPNList[0].WWPNValue; 
     FCID = port.WWPNList[0].FCIDValue; 

    } 
} 

ObservableCollection<PortResult> FCPortCollection = new ObservableCollection<PortResult>(); 

// results is an IEnumerable collection of FCPort result from a LINQ query that has been turned into a Dictionary 
foreach (KeyValuePair<string, List<FCPort>> resultspair in results) 
     { 
      foreach (FCPort port in resultspair.Value) 
      {  
       // create a new PortResult and add it to the ObservableCollection 
       PortResult pr = new PortResult(resultspair.Key, port); 
       FCPortCollection.Add(pr); 
      } 
     } 
+0

知道[如何調試綁定](http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application的.aspx)? – 2012-02-21 18:27:48

+0

我現在要做。 :)這是有幫助的。謝謝。 – 2012-02-21 19:21:40

+0

不客氣,那些基礎知識很重要:) – 2012-02-21 19:23:35

回答

3

有在您發佈的代碼的幾個問題:

  1. 的結合語法您ItemsSource缺少{}括號 - 它需要ItemsSource="{Binding FCPortCollection}"
  2. 只能綁定屬性,但是你只會暴露PortResult類中的字段。將這些字段更改爲屬性。

同時確保ListView的DataContext設置到包含FCPortCollection的對象。還要確保集合是對象的屬性而不是字段(與上面第2點相同的原因)。

+0

我修復了ItemsSource問題,並更改了PortResult類以使私有字段支持公共屬性。我還添加了這個:DefaultListView.DataContext = FCPortCollection;到代碼。 FCPortCollection是類型爲ObserveableCollection的類變量,用於包含ListView Stll no joy的表單。 – 2012-02-21 18:24:25

+0

@DavidGreen:如果將ListView的DataContext直接設置爲集合,那麼您需要使用'ItemsSource = {Binding}'(沒有指定路徑)。綁定總是相對於數據上下文。如果你說'{Binding Foo}',那麼綁定引擎將在數據上下文對象中尋找一個名爲'Foo'的屬性。 – ChrisWue 2012-02-21 18:35:10

+0

謝謝克里斯。我解決了一些問題,DataContext現在顯示了一個項目列表,就像調試器WatchWindow中的ItemsSource一樣。但是,ListView仍然不顯示項目。我驗證了PortResult類中的屬性名稱與GridViewColumns的綁定名稱相同 – 2012-02-21 19:16:54

2

此:

ItemsSource="Binding FCPortCollection" 

是不具有約束力的,你忘了括號{},因此分配char[]作爲ItemsSource代替。

相關問題