解决了问题 - 请参阅本文的底部 - 我不断得到一个nullreferenceexception并且无法找出原因,更不用说如何修复它了。我有两个组合框,从一个选择一个值应该使用一组相关的值填充另一个。
<CollectionViewSource x:Key="branchesViewSource"
Source="{Binding Path=Branches, Source={StaticResource contactDBDataSet}}" />
<CollectionViewSource x:Key="ranksViewSource"
Source="{Binding Path=RankPath, Source={StaticResource contactDBDataSet}}" />
private void loadBranches()
{
DocMan.ContactDBDataSet contactDBDataSet = ((DocMan.ContactDBDataSet)(this.FindResource("contactDBDataSet")));
// Load data into the table Branches. You can modify this code as needed.
DocMan.ContactDBDataSetTableAdapters.BranchesTableAdapter contactDBDataSetBranchesTableAdapter = new DocMan.ContactDBDataSetTableAdapters.BranchesTableAdapter();
contactDBDataSetBranchesTableAdapter.Fill(contactDBDataSet.Branches);
System.Windows.Data.CollectionViewSource branchesViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("branchesViewSource")));
branchesViewSource.View.MoveCurrentToFirst();
}
以上工作正常,并填充第一个组合框。第二个代码块应该填充第二个组合框。
DocMan.ContactDBDataSet contactDBDataSet = ((DocMan.ContactDBDataSet)(this.FindResource("contactDBDataSet")));
// Retrieve branchComboBox SelectedItem
string currentItem = ((DataRowView)branchComboBox.SelectedItem)["Branch"].ToString();
// Load data into table Ranks
switch (currentItem)
{
case "Army":
rankPath = "ArmyRanks";
DocMan.ContactDBDataSetTableAdapters.ArmyRanksTableAdapter contactDBDataSetArmyRanksTableAdapter = new ContactDBDataSetTableAdapters.ArmyRanksTableAdapter();
contactDBDataSetArmyRanksTableAdapter.Fill(contactDBDataSet.ArmyRanks);
break;
case "Navy":
rankPath = "NavyRanks";
DocMan.ContactDBDataSetTableAdapters.NavyRanksTableAdapter contactDBDataSetNavyRanksTableAdapter = new ContactDBDataSetTableAdapters.NavyRanksTableAdapter();
contactDBDataSetNavyRanksTableAdapter.Fill(contactDBDataSet.NavyRanks);
break;
case blahblahblah and more cases
}
// Populate rankComboBox
System.Windows.Data.CollectionViewSource ranksViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("ranksViewSource")));
ranksViewSource.View.MoveCurrentToFirst();
}
nullreferenceexception发生在最后一行,基本上告诉我rankViewSource.View为null。与第一个代码块相比,branchesViewSource.View的类型为System.Windows.Data.BindingListCollectionView。任何帮助或见解都会提前得到很多赞赏。
的 的 _---- _ ----
我需要创建一个新的Binding并设置Source&amp;绑定的路径,然后适当地应用我的组合框的SetBinding()方法。
DocMan.ContactDBDataSet contactDBDataSet = ((DocMan.ContactDBDataSet)(this.FindResource("contactDBDataSet")));
// Create binding
Binding rankBinding = new Binding();
// Retrieve branchComboBox SelectedItem
string currentItem = branchComboBox.SelectedValuePath;
// Load data into table Ranks
switch (currentItem)
{
case "Army":
rankBinding.Path = new PropertyPath("ArmyRanks");
rankBinding.Source = this.FindResource("rankViewSource");
rankComboBox.SetBinding(ComboBox.ItemsSourceProperty, rankBinding);
DocMan.ContactDBDataSetTableAdapters.ArmyRanksTableAdapter contactDBDataSetArmyRanksTableAdapter = new ContactDBDataSetTableAdapters.ArmyRanksTableAdapter();
contactDBDataSetArmyRanksTableAdapter.Fill(contactDBDataSet.ArmyRanks);
// Populate rankComboBox
CollectionViewSource armyRanksViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("rankViewSource")));
armyRanksViewSource.View.MoveCurrentToFirst();
答案 0 :(得分:1)
我知道这是一个迟到的反应,但是,如果我的经验可以拯救经历了几天痛苦的人,那么我觉得分享我的经历是有价值的......
在我的代码区域运行一段时间后,我遇到了同样的错误。事实证明,在对数据库进行必要的重建之后,我没有将试用数据重新加载到我的一个表中。因为表是空的,所以FindResource返回了一个有效的CollectionViewSource,但它的View属性为null。
我的简单修复是更改自动生成的代码以测试此操作,如果View为null,则 不 调用MoveCurrentToFirst():
PRIMARY KEY
@ Archaios7,我必须承认我不明白为什么你说你需要创建一个新的Binding并设置Source&amp;绑定的路径,然后应用我的组合框的SetBinding()方法&#34;所以我不知道你的解决方案是否比我的好。 (我感谢那些急需向我解释的人: - )
我认为我的评论的重要性更多是关于问题的原因 - 我承认,这让我感到非常惊讶 - 而不是我的解决方案。
答案 1 :(得分:0)
我猜测了一下,因为我的一些语法对我来说有点陌生,但我相信发生了什么......
<CollectionViewSource x:Key="branchesViewSource"
Source="{Binding Path=Branches, Source={StaticResource contactDBDataSet}}" />
// ^ ^ ---------------------------------------
contactDBDataSetBranchesTableAdapter.Fill(contactDBDataSet.Branches);// |
// ^ ^--------|
// path matches so view is populated
<CollectionViewSource x:Key="ranksViewSource"
Source="{Binding Path=RankPath, Source={StaticResource contactDBDataSet}}" />
// ^ ^---------------------------------------|
contactDBDataSetArmyRanksTableAdapter.Fill(contactDBDataSet.ArmyRanks);// |
// ^ ^-------|
// These don't match so from code posted
// view for ranksViewSource is still null
在某些时候你需要一些东西来填充RankPath(目前还不清楚这是否发生在发布的代码中)。