CollectionViewSource.View为null

时间:2012-08-16 20:51:37

标签: c# wpf

解决了问题 - 请参阅本文的底部 - 我不断得到一个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();

2 个答案:

答案 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(目前还不清楚这是否发生在发布的代码中)。