【问题标题】:Find selected WPF Listbox entries查找选定的 WPF 列表框条目
【发布时间】:2011-02-16 09:40:21
【问题描述】:

我一直在尝试使用以下代码遍历 WPF 中列表框的选定项;

        try
        {
            for (int i = 0; i < mylistbox.SelectedItems.Count; i++)
            {
                ListItem li = (ListItem)mylistbox.SelectedItems[i];

                string listitemcontents_str = li.ToString();
            }
        }
        catch(Exception e)
        {
            // Error appears here
            string error = e.ToString();
        }

但是我收到了一个无效的强制转换异常;

System.InvalidCastException:无法将“mylist”类型的对象转换为“System.Windows.Documents.ListItem”类型。

有没有办法解决这个问题?

【问题讨论】:

    标签: c# wpf .net-3.5


    【解决方案1】:

    您将ListItemListBoxItem 混淆了。

    如果您没有做任何特别的事情,ListBox 将为您绑定到它的数据创建 ListBoxItem 容器。 ListItemFlowDocument 内部使用,基本上是文档中的编号或项目符号点。

    也就是说,数据绑定会更好。如果您使用数据绑定,SelectedItems 将不是 ListBoxItem,而是您实际绑定的数据项。您可以将其转换为适当的类型并使用它。

    【讨论】:

      【解决方案2】:

      我发现的一种方法是将列表框分配给一个对象,然后将其转换为 DataRowView。似乎可以工作,我可以通过它们各自的列名访问里面的字段。

      对象选择 = mylistbox.SelectedItem; DataRow 行 = ((DataRowView)selected).Row;
      string thecontents = row["列名"].ToString().TrimEnd();

      【讨论】:

        【解决方案3】:

        列表框将其项目添加为对象集合,因此无法将其强制转换为 ListItem。 因此,出于您的目的,您可以执行以下操作:

        for (int i = 0; i < mylistbox.SelectedItems.Count; i++) 
                {           
        
                    string listitemcontents_str = mylistbox.SelectedItems[i].ToString(); 
                } 
        

        如果您真的想使用 ListBoxItem ,请将这些项目添加到您的列表框中,例如

        ListBoxItem li = new ListBoxItem();
        li.Content = "Hello";
        mylistbox.Items.Add(li);
        

        那么你可以做你想做的事而没有无效的演员表例外:

        for (int i = 0; i < mylistbox.SelectedItems.Count; i++)
                    {
                    ListBoxItem li = (ListBoxItem)mylistbox.SelectedItems[i];
                    string s = li.ToString();
                    }
        

        【讨论】:

        • 不正确。除非 GetContainerForItemOverride 被覆盖,否则将生成一个 ListBoxItem 作为每个对象的包装器(除非对象本身是 ListBoxItem)。
        【解决方案4】:
          for (int i = 0; i < mylistbox.SelectedItems.Count; i++)
            {
                List**Box**Item li = (List**Box**Item)mylistbox.SelectedItems[i];
        
                string listitemcontents_str = li.ToString();
            }
        

        【讨论】:

          【解决方案5】:

          我更喜欢使用数据绑定来做到这一点: Sync SelectedItems in a muliselect listbox with a collection in ViewModel

          【讨论】:

          • 我同意布赖恩的观点。如果您想获得 WPF 的强大功能,这将是一种更好的方法。
          【解决方案6】:

          这应该可行:

                 for (int i = 0; i < mylistbox.SelectedItems.Count; i++)
                  {
                      var li = mylistbox.SelectedItems[i];
          
                      string listitemcontents_str = li.ToString();
                  }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-09
            • 1970-01-01
            • 1970-01-01
            • 2011-01-16
            • 1970-01-01
            • 1970-01-01
            • 2010-12-15
            相关资源
            最近更新 更多