C# 向WPF列表视图动态添加项

C# 向WPF列表视图动态添加项,c#,wpf,xaml,listview,data-binding,C#,Wpf,Xaml,Listview,Data Binding,我试图通过编程方式将项目添加到WPF中的列表视图中。我已经读了很多书(包括这里的一些问题),认为我做得很正确,但是这些东西没有显示出来。据我所知,我创建了ListView并将其绑定到一个数据源,在本例中是一个ObservableCollection。我已经验证了ObservaleCollection正在将项目添加到其中,但它们没有显示在ListView上。如果重要的话,在我运行LINQ查询并尝试向其中添加项时,ListView已经实例化 以下是定义列表视图的XAML: <TabPanel

我试图通过编程方式将项目添加到WPF中的列表视图中。我已经读了很多书(包括这里的一些问题),认为我做得很正确,但是这些东西没有显示出来。据我所知,我创建了ListView并将其绑定到一个数据源,在本例中是一个ObservableCollection。我已经验证了ObservaleCollection正在将项目添加到其中,但它们没有显示在ListView上。如果重要的话,在我运行LINQ查询并尝试向其中添加项时,ListView已经实例化

以下是定义列表视图的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);
            }
        }
公共类PortResult
{
公共字符串名称;
公共字符串端口;
公共字符串FCID;
公共字符串WWPN;
公共端口结果(字符串名称,FCPort端口)
{
SwitchName=名称;
FCPort=String.Format(“fc{0}/{1}”,port.SlotNum,port.PortNum);
WWPN=port.WWPNList[0].WWPNValue;
FCID=port.WWPNList[0]。FCIDValue;
}
}
ObservableCollection FCPortCollection=新的ObservableCollection();
//results是来自已转换为字典的LINQ查询的FCPort结果的IEnumerable集合
foreach(KeyValuePair结果对结果)
{
foreach(resultspair.Value中的FCPort端口)
{    
//创建新的PortResult并将其添加到ObservableCollection
PortResult pr=新的PortResult(resultspair.Key,port);
FCPortCollection.Add(pr);
}
}
这是:

ItemsSource=“Binding FCPortCollection”
不是绑定,您忘记了大括号
{}
,因此将
char[]
指定为
ItemsSource

此:

ItemsSource=“Binding FCPortCollection”

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

您发布的代码中有几个问题:

  • ItemsSource
    的绑定语法缺少{}大括号-它需要是
    ItemsSource=“{binding FCPortCollection}”
  • 您只能绑定到属性,但只能公开
    PortResult
    类中的字段。将这些字段更改为属性

  • 还要确保将
    列表视图的DataContext设置为包含
    FCPortCollection
    的对象。还要确保集合是对象的属性,而不是字段(与上面第2点的原因相同)。

    您发布的代码中有几个问题:

  • ItemsSource
    的绑定语法缺少{}大括号-它需要是
    ItemsSource=“{binding FCPortCollection}”
  • 您只能绑定到属性,但只能公开
    PortResult
    类中的字段。将这些字段更改为属性

  • 还要确保将
    列表视图的DataContext设置为包含
    FCPortCollection
    的对象。还要确保集合是对象的属性而不是字段(与上面第2点的原因相同)。

    我修复了ItemsSource问题,并将PortResult类更改为具有由私有字段支持的公共属性。我还添加了:DefaultListView.DataContext=FCPortCollection;遵守守则。FCPortCollection是包含ListView Stll no joy的窗体的ObservableCollection类型的类变量。@DavidGreen:如果将ListView的DataContext直接设置为集合,则需要使用
    ItemsSource={Binding}
    (未指定路径)。绑定始终与数据上下文相关。如果您说
    {Binding Foo}
    ,那么绑定引擎将在数据上下文对象中查找名为
    Foo
    的属性。谢谢。我修复了一些问题,DataContext现在显示了一个项目列表,就像调试器监视窗口中的ItemsSource一样。但是,ListView仍然没有显示项目。我验证了PortResult类中属性的名称与GridViewColumnSH绑定的名称相同。在为包含ListView的窗口调用InitializeComponent()后,我执行所有这些操作是否有问题?我看到的大多数示例在包含ListView的表单的构造函数中都有这些内容,然后调用InitializeComponent()。最后,我希望能够将选项卡添加到具有不同搜索结果的其他列表视图的选项卡集合中。感谢所有帮助。在调试程序中做了一些工作之后,我去掉了选项卡控件。现在这个列表起作用了,我可以看到了。我想找出为什么我看不到选项卡控件内的列表。我的想法是能够在数据上运行不同的查询,每个查询都位于自己的选项卡中。我修复了ItemsSource问题,并将PortResult类更改为具有由私有字段支持的公共属性。我还添加了:DefaultListView.DataContext=FCPortCollection;遵守守则。FCPortCollection是包含ListView Stll no joy的窗体的ObservableCollection类型的类变量。@DavidGreen:如果将ListView的DataContext直接设置为集合,则需要使用
    ItemsSource={Binding}
    (未指定路径)。绑定始终与数据上下文相关。如果您说
    {Binding Foo}
    ,那么绑定引擎将在数据上下文对象中查找名为
    Foo
    的属性。谢谢。我修复了一些问题,DataContext现在显示了一个项目列表,正如它所显示的一样