C# 铸造错误

C# 铸造错误,c#,wpf,casting,listbox,entity,C#,Wpf,Casting,Listbox,Entity,当然,目前我正在尝试从类Landen中检查LandCode,以从selectedItemland中获取城市,但我分析了一些错误 public partial class Landen { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public Landen() {

当然,目前我正在尝试从类
Landen
中检查
LandCode
,以从
selectedItem
land中获取城市,但我分析了一些错误

public partial class Landen
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Landen()
    {
        this.Steden = new HashSet<Steden>();
        this.Talen = new HashSet<Talen>();
    }

    public string LandCode { get; set; }
    public string Naam { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Steden> Steden { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Talen> Talen { get; set; }
}



public MainWindow()
{
    InitializeComponent();
    var context = new LandenStedenTalenEntities();
    landenListBox.ItemsSource = (from Landen in context.Landen select Landen.Naam).ToList();
}

private void landenListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    using (var entities = new LandenStedenTalenEntities())
    {
        List<string> steden = new List<string>();
        var landcode = ((Landen)landenListBox.SelectedItem).LandCode.ToString();
        var gekozenland = entities.Landen.Find(landcode);

        foreach(var stad in gekozenland.Steden)
        {
            steden.Add(stad.Naam);
        }
        stedenInLandenListBox.ItemsSource = steden.ToList();
    }
}
公共部分类Landen
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共兰登()
{
this.Steden=new HashSet();
this.Talen=new HashSet();
}
公共字符串土地代码{get;set;}
公共字符串Naam{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection Steden{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection Talen{get;set;}
}
公共主窗口()
{
初始化组件();
var context=新的LandenstedentalEntities();
LandEnclestBox.ItemsSource=(在context.Landen中从Landen选择Landen.Naam.ToList();
}
private void LandEnclestBox_SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
使用(var entities=new LandenStedenTalenEntities())
{
List steden=新列表();
var landcode=((Landen)landEnstractBox.SelectedItem.landcode.ToString();
var gekozenland=entities.Landen.Find(landcode);
foreach(gekozenland.Steden的var stad)
{
添加(stad.Naam);
}
StedenInlandListBox.ItemsSource=steden.ToList();
}
}
例外情况:

无法将“System.String”类型的对象强制转换为“TestEFDieter.Landen”类型

我想将它们添加到列表中,并在第二个列表框中显示它们。 有人能帮我吗?多谢各位


我想您希望获得与列表中所选项目对应的
Landen
实例。由于列表框中的元素只是表示每个
Landen
Naam
-属性的字符串,您可以简单地迭代
Landen
列表,并使用所需的
Naam
获取该列表:

var selectedLanden = landenList.FirstOrDefault(x => x.Naam == landenListBox.SelectedItem);
if(selectedLanden != null)
{
    var landCode = selectedLanden.LandCode;
    // ...
}
但是,由于
selectedLanden
已经是
Landen
的一个实例,因此您不需要通过其
LandCode
再次找到它。因此,您的代码最终会得出以下结论:

List<string> steden = new List<string>();
var selectedLanden = landenList.FirstOrDefault(x => x.Naam == landenListBox.SelectedItem);
if(selectedLanden != null)
{
    foreach(var stad in selectedLanden.Steden)
    {
        steden.Add(stad.Naam);
    }
}
stedenInLandenListBox.ItemsSource = steden.ToList();
为了实现这一点,您当然必须在您的班级中存储对
Landen
somewe列表的引用:

class MainWindow
{
    List<Landen> landenList;
    public MainWindow()
    {
        InitializeComponent();
        this.landenList = new LandenStedenTalenEntities();
        landenListBox.ItemsSource = (from Landen in this.landenList select Landen.Naam).ToList();
    }
}
class主窗口
{
土地登记表;
公共主窗口()
{
初始化组件();
this.landenList=新的LandenstedentalEntities();
LandEnstractBox.ItemsSource=(从该.LandEnstract中的Landen选择Landen.Naam.ToList();
}
}

我建议您修改构造函数内部的代码,以便
LandEnclestBox
将包含实际的
Landen
对象,并仅将
Naam
显示为其项

将构造函数中的代码更改为:

public MainWindow()
{
    InitializeComponent();
    var context = new LandenStedenTalenEntities();
    landenListBox.ItemsSource = context.Landen.ToList();
    landenListBox.DisplayMemberPath = "Naam";
}
添加将通知
ListBox
将该特定属性显示为项,而不是对该对象调用
ToString()
方法

现在,在以后的代码中,您不必做太多更改,只需删除
ToList()
,因为您使用的是
EntityFramework
,您应该将整个模型插入到它的
Find()
方法中,但它没有用,因为您已经加载了该对象。您可以直接从中检索
stad
,并以与显示
Landen
相同的方式显示:

private void landenListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var landen = landenListBox.SelectedItem as Landen; // safe cast just in case
    if (landen != null && landen.Steden != null ) // null checks
    {
        stedenInLandenListBox.ItemsSource = landen.Steden.ToList(); // in case it's proxy object
        stadenInLandenListBox.DisplayMemberPath = "Naam";
    }
}

您的错误在哪里?var landcode=((Landen)land登记框.SelectedItem.landcode.ToString();其他信息:无法将类型为“System.String”的对象强制转换为类型为“TestEFDieter.Landen”。使用此
.ToString().ToList()尝试实现什么?字符串已经是一个“字符数组”,你只需调用索引器就可以对其进行迭代。这被称为“无望”试图不经思考就找到一些东西-“
SelectedItem
显然包含一个字符串,它不能转换为
Landen
。我们不知道什么是
Landen
,也不知道您如何通过列表框中选择的内容来获得该类的实例,我只想在第二个列表框中显示具有所选土地的土地代码的城市请准确显示问题中出现错误的位置谢谢您的评论先生!竖起大拇指是一种魅力和很好的解释,谢谢你,先生!竖起大拇指
private void landenListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var landen = landenListBox.SelectedItem as Landen; // safe cast just in case
    if (landen != null && landen.Steden != null ) // null checks
    {
        stedenInLandenListBox.ItemsSource = landen.Steden.ToList(); // in case it's proxy object
        stadenInLandenListBox.DisplayMemberPath = "Naam";
    }
}