【问题标题】:Dynamically Adding Items To a WPF List View将项目动态添加到 WPF 列表视图
【发布时间】:2012-02-21 17:37:55
【问题描述】:

我正在尝试以编程方式将项目添加到 WPF 中的 ListView。我做了很多阅读(包括这里的一些问题)并认为我做对了,但这些项目没有出现。据我了解,我创建了 ListViewe 并将其绑定到数据源,在本例中为 ObservableCollection。我已经验证 ObservableCollection 正在向其中添加项目,但它们没有显示在 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);
            }
        }

【问题讨论】:

  • 我现在做。 :) 这很有帮助。谢谢。
  • 不客气,这些基础知识很重要 :)

标签: c# wpf xaml listview data-binding


【解决方案1】:

你贴的代码有几个问题:

  1. ItemsSource 的绑定语法缺少 {} 大括号 - 它必须是 ItemsSource="{Binding FCPortCollection}"
  2. 您只能绑定到属性,但是您只能公开PortResult 类中的字段。将这些字段更改为属性。

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

【讨论】:

  • 我修复了 ItemsSource 问题并将 PortResult 类更改为具有由私有字段支持的公共属性。我还添加了这个: DefaultListView.DataContext = FCPortCollection;到代码。 FCPortCollection 是一个 ObserveableCollection 类型的类变量,用于包含 ListView 的表单,没有乐趣。
  • @DavidGreen:如果将 ListView 的 DataContext 直接设置为集合,则需要使用 ItemsSource={Binding}(未指定路径)。绑定始终与数据上下文相关。如果您说{Binding Foo},那么绑定引擎将在数据上下文对象中查找名为Foo 的属性。
  • 谢谢克里斯。我修复了一些问题,DataContext 现在显示项目列表,调试器 WatchWindow 中的 ItemsSource 也是如此。但是,ListView 仍然不显示项目。我验证了 PortResult 类中的属性名称与 GridViewColumns 的绑定名称相同
  • 哦,在为包含 ListView 的窗口调用 InitializeComponent() 之后,我正在执行所有这些操作是否有问题?我看到的大多数示例都在包含 ListView 的表单的构造函数中包含所有这些,然后调用 InitializeComponent()。最终,我希望能够将标签添加到 TabCollection 以及具有不同搜索结果的其他列表视图
  • 感谢所有帮助。在调试器中进行了一些工作后,我摆脱了选项卡控件。现在列表有效,我可以看到它。我想弄清楚为什么我在选项卡控件中看不到列表。我的想法是能够对数据运行不同的查询,每个查询都在自己的选项卡中。
【解决方案2】:

这个:

ItemsSource="Binding FCPortCollection"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多