动态添加项目到WPF列表视图

时间:2012-02-21 17:37:56

标签: c# wpf xaml listview data-binding

我正在尝试以编程方式将项添加到WPF中的ListView。我已经做了很多阅读(包括这里的一些问题),并认为我正确地做了但项目没有出现。据我了解,我创建ListViewe并将其绑定到数据源,在本例中为ObservableCollection。我已经验证了ObservableCollection正在添加项目,但它们没有显示在ListView上。如果重要,ListView已经在我运行LINQ查询时实例化,并尝试向其添加项目。

以下是定义列表视图的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);
            }
        }

2 个答案:

答案 0 :(得分:3)

您发布的代码存在以下几个问题:

  1. ItemsSource的绑定语法缺少{}大括号 - 它必须是ItemsSource="{Binding FCPortCollection}"
  2. 您只能绑定到属性,但是只展示PortResult类中的字段。将这些字段更改为属性。
  3. 还要确保ListView的DataContext设置为包含FCPortCollection的对象。还要确保集合是对象的属性而不是字段(与上面第2点相同的原因)。

答案 1 :(得分:2)

此:

ItemsSource="Binding FCPortCollection"

不是绑定,您忘记了大括号{},因此将char[]改为ItemsSource