0

问题已解决 - 请参阅这篇文章的底部- 我不断收到 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 发生在最后一行,基本上告诉我ranksViewSource.View 为null。与第一段代码相比,branchesViewSource.View 的类型为 System.Windows.Data.BindingListCollectionView。提前非常感谢任何帮助或见解。

_---- _ ----

我需要创建一个新的绑定并设置绑定的源和路径,然后根据需要应用我的组合框的 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();
4

2 回答 2

1

我知道这是一个迟到的回应,但是,如果我的经历可以帮助某人度过我所经历的几天的痛苦,那么我觉得分享我的经历很有价值......

在我的代码的这个区域已经无故障运行了一段时间后,我发生了同样的错误。事实证明,在对我的数据库进行必要的重建后,我没有将试验数据重新加载到我的一张表中。由于表为空,FindResource 返回了一个有效的 CollectionViewSource,但其 View 属性为空。

我的简单解决方法是更改​​自动生成的代码以对此进行测试,并且如果 View 为空则不调用 MoveCurrentToFirst():

CollectionViewSource myViewSource = ((CollectionViewSource)(FindResource("myViewSource")));
if (myViewSource.View != null)
    myViewSource.View.MoveCurrentToFirst();

@Archaios7,我必须承认我不明白你为什么说你“需要创建一个新的绑定并设置绑定的源和路径,然后应用我的组合框的 SetBinding() 方法”所以我不知道是否你的解决方案比我的好。(我感谢任何迫切需要向我解释这一点的人 :-)

我认为我的评论的重要性更多地在于问题的原因——我承认,这让我很惊讶——而不是我的解决方案。

于 2016-07-01T01:22:34.333 回答
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(目前还不清楚发布的代码是否会发生这种情况)。

于 2012-08-17T00:27:28.140 回答