目前,我正在尝试从Landen类中检查Landen以获取来自selectedItem的城市,但是我正在解析一些错误。
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”。
我希望将它们添加到列表中,并在第二个列表框中显示它们。有人能帮我吗?谢谢。

发布于 2018-02-07 09:20:35
我建议您修改构造函数内部的代码,以便landenListBox将包含实际的Landen对象,并且只将Naam显示为它的项。
将构造函数中的代码更改为:
public MainWindow()
{
InitializeComponent();
var context = new LandenStedenTalenEntities();
landenListBox.ItemsSource = context.Landen.ToList();
landenListBox.DisplayMemberPath = "Naam";
}添加DisplayMemberPath将通知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";
}
}发布于 2018-02-07 09:12:20
我想您想要得到Landen的实例,它对应于列表中选定的项。由于列表框中的元素只是表示每个Naam-property的Landen的字符串,所以您可以简单地迭代您的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();或者更短一点:
stedenInLandenListBox.ItemsSource = selectedLanden.SelectMany(x => x.Steden.Select(y => y.Naam)).ToList();当然,要使其工作,您必须在您的类中存储对Landen列表的引用:
class MainWindow
{
List<Landen> landenList;
public MainWindow()
{
InitializeComponent();
this.landenList = new LandenStedenTalenEntities();
landenListBox.ItemsSource = (from Landen in this.landenList select Landen.Naam).ToList();
}
}https://stackoverflow.com/questions/48659590
复制相似问题