尝试从 ListBox 对象转换为 MyListBox 时出现 invalidcastexception:WPF 中的 ListBox 对象
invalidcastexception when trying to convert from ListBox object to MyListBox : ListBox object in WPF
我在代码中使用 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 中,我使用私有 class 来扩展 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。你能告诉我为什么这可能吗?
通过将 class 的范围从 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"
一般来说,您不能像那样将基类型强制转换为派生类型。另一种选择是将构造函数中的 ListBox
传递给您的 class,然后创建属性以公开您要访问的 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
。
我在代码中使用 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 中,我使用私有 class 来扩展 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。你能告诉我为什么这可能吗?
通过将 class 的范围从 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"
一般来说,您不能像那样将基类型强制转换为派生类型。另一种选择是将构造函数中的 ListBox
传递给您的 class,然后创建属性以公开您要访问的 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
。