【问题标题】:invalidcastexception when trying to convert from ListBox object to MyListBox : ListBox object in WPF尝试从 ListBox 对象转换为 MyListBox 时出现 invalidcastexception:WPF 中的 ListBox 对象
【发布时间】:2015-03-14 10:35:18
【问题描述】:

我在我的代码中使用 ListBox 来存储用户选择的一些 csv 文件:

<ListBox x:Name="emailsFilesListBox" HorizontalAlignment="Left" Height="67" Margin="10,254,0,0" Grid.Row="1" VerticalAlignment="Top" Width="147"/>

在 MainWindow.xaml.cs 我使用私有类来扩展 System.Windows.Controls.ListBox:

private class MyListBox : System.Windows.Controls.ListBox
        {
            public string[] FullFilesPathsList { get; set; }
            public MyListBox() : base()
            {
            }
        }

在 MainWindow.xaml.cs 的事件处理程序中,我有以下代码:

  private void emailsAdd_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
        dlg.Multiselect = true;
        dlg.Filter = "CSV Files|*.csv";
        Nullable<bool> result = dlg.ShowDialog();

        if (result == true)
        {
            MyListBox myListBoxWithEmailsFiles = new MyListBox();
            myListBoxWithEmailsFiles = (MyListBox)emailsFilesListBox;
            myListBoxWithEmailsFiles.FullFilesPathsList = dlg.FileNames;
            ....................................

        }
    }

尝试执行转换“myListBoxWithEmailsFiles = (MyListBox)emailsFilesListBox;”导致 InvalidCastException。你能告诉我为什么会这样吗?

【问题讨论】:

  • emailsFilesListBox 是 ListBox,而不是 MyListBox。每个MyListBox 都是ListBox 但不是相反
  • 为什么在这种情况下不允许向下转换?
  • 因为在 XAML 中它不是创建为MyListBox,而是ListBox。您创建 MyListBox 类但不使用它
  • 感谢您的回复。如果要在 XAML 中进行修改(当然,只是将标签 ListBox 更改为 MyListBox 并没有解决任何问题)以使事情正常进行,我期待您的建议。

标签: c# wpf xaml listbox


【解决方案1】:

通过将类的范围从private 更改为public,然后相应地更改您的XAML,使用MyListBox 而不是ListBox:

<nameOfYourWpfProject:MyListBox x:Name="emailsFilesListBox" 
    HorizontalAlignment="Left" Height="67" Margin="10,254,0,0" Grid.Row="1" 
    VerticalAlignment="Top" Width="147"/>

你必须在你的主要Window标签中添加这样的东西:

xmlns:nameOfYourWpfProject="clr-namespace:NameOfYourWpfProject"

一般来说,您不能像这样将基类型强制转换为派生类型。另一种选择是将 ctor 中的 ListBox 传递给您的类,然后创建属性以公开您要访问的 ListBox 属性。

private class MyListBox : System.Windows.Controls.ListBox
{
    public string[] FullFilesPathsList { get; set; }

    public MyListBox(ListBox listBox)
    {
        this.listBox = listBox;
    }

    private ListBox listBox;

    public string Name { get { return listBox.Name; } }
}

在这种情况下,如果您只使用 MyListBox 代替 ListBox,则不需要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多