首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >铸造错误

铸造错误
EN

Stack Overflow用户
提问于 2018-02-07 08:58:30
回答 2查看 72关注 0票数 1

目前,我正在尝试从Landen类中检查Landen以获取来自selectedItem的城市,但是我正在解析一些错误。

代码语言:javascript
复制
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();
    }
}

例外:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-07 09:20:35

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

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

代码语言:javascript
复制
public MainWindow()
{
    InitializeComponent();
    var context = new LandenStedenTalenEntities();
    landenListBox.ItemsSource = context.Landen.ToList();
    landenListBox.DisplayMemberPath = "Naam";
}

添加DisplayMemberPath将通知ListBox将该特定属性显示为一个项,而不是在该对象上调用ToString()方法。

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

代码语言:javascript
复制
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";
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-02-07 09:12:20

我想您想要得到Landen的实例,它对应于列表中选定的项。由于列表框中的元素只是表示每个Naam-property的Landen的字符串,所以您可以简单地迭代您的Landen列表,并使用所需的Naam获取该列表。

代码语言:javascript
复制
var selectedLanden = landenList.FirstOrDefault(x => x.Naam == landenListBox.SelectedItem);
if(selectedLanden != null)
{
    var landCode = selectedLanden.LandCode;
    // ...
}

但是,由于selectedLanden已经是Landen的一个实例,所以您不必再通过它的LandCode找到它。因此,您的代码不需要这样做:

代码语言:javascript
复制
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();

或者更短一点:

代码语言:javascript
复制
stedenInLandenListBox.ItemsSource = selectedLanden.SelectMany(x => x.Steden.Select(y => y.Naam)).ToList();

当然,要使其工作,您必须在您的类中存储对Landen列表的引用:

代码语言:javascript
复制
class MainWindow
{
    List<Landen> landenList;
    public MainWindow()
    {
        InitializeComponent();
        this.landenList = new LandenStedenTalenEntities();
        landenListBox.ItemsSource = (from Landen in this.landenList select Landen.Naam).ToList();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48659590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档