c# - 尝试从 ListBox 对象转换为 MyListBox 时出现 invalidcastException : ListBox object in WPF

标签 c# wpf xaml listbox

我在代码中使用 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 中,我使用私有(private)类来扩展 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。你能告诉我为什么这可能吗?

最佳答案

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

<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"

一般来说,您不能将基类型转换为这样的派生类型。另一种选择是将构造函数中的 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,则不需要这样做。

关于c# - 尝试从 ListBox 对象转换为 MyListBox 时出现 invalidcastException : ListBox object in WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29047915/

相关文章:

wpf - 禁用切换按钮选择颜色

c# - 来自 .NET 程序的 OpenGL 警告

c# - Linq 和二进制搜索 - 改进这个缓慢的 Where 语句?

c# - 在 C# 中使用 Newtonsoft.JSON 努力反序列化 JSON 字符串

c# - C#调用存储过程

c# - 如何判断修改键何时被按下/释放

c# - 在 WPF 中将 ARGB 转换为 RGB

wpf - 箭头的 xaml 路径数据

c# - XAML 显示默认安装的打印机

c# - 在设置另一个VisualState之后,如何维护VisualState触发器所做的更改?