2012-02-21 97 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代替。