Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带组合框的ICollectionView_C#_Wpf - Fatal编程技术网

C# 带组合框的ICollectionView

C# 带组合框的ICollectionView,c#,wpf,C#,Wpf,我有一个名为States 在状态中型号中,我有id、姓名、代码、国家/地区 我想保留这些收藏,但我想做一个新的收藏,只过滤国家。目前,我通过以下方式实现了此功能: ViewModel.cs StateCollectionView = CollectionViewSource.GetDefaultView(States); StateCollectionView.Filter += StatesFilter; public static void GetStates() { Stat

我有一个名为
States

状态中
型号中,我有id、姓名、代码、国家/地区

我想保留这些收藏,但我想做一个新的收藏,只过滤国家。目前,我通过以下方式实现了此功能:

ViewModel.cs

StateCollectionView = CollectionViewSource.GetDefaultView(States);
StateCollectionView.Filter += StatesFilter;

public static void GetStates()
{


    States.Clear();
    using var conn = new SqlConnection(Settings.Default.ConnectionString);

    conn.Open();
    string qry = "SELECT * FROM dbo.State";
    var cmd = new SqlCommand(qry, conn);

    var reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        States.Add(new States(reader));

    }
            
        conn.Close();
    }

    public static bool StatesFilter(object state)
    {
        bool result = true;
        if (state is States states)
        {
            if (states.Country)
            {
                Debug.Print(states.Name);
                return true;
            }
            else
            {
                return false;
            }
        }


        return result;
}
    
这是通过过滤
状态的
ObservableCollection
来实现的,但我不想过滤该集合,而是创建一个
ICollectionViewSource
,并在视图的绑定中使用它。因为我需要不过滤
状态
可观测采集
,以便在其他视图中显示正确的数据

我试图将它绑定到国家下拉列表中的
组合框
,我希望它仅显示县,而州下拉列表仅显示州。它们由数据库中的布尔值分隔开

编辑:样本

StateCollectionView = CollectionViewSource.GetDefaultView(States);
            CountryCollectionView = CollectionViewSource.GetDefaultView(States);
            StateCollectionView.Filter += StatesFilter;
            CountryCollectionView.Filter += CountryFilter;

public static void GetStates()
        {


            States.Clear();
            using var conn = new SqlConnection(Settings.Default.ConnectionString);

            conn.Open();
            string qry = "SELECT * FROM dbo.State";
            var cmd = new SqlCommand(qry, conn);

            var reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                States.Add(new States(reader));

            }
            
            conn.Close();
        }

        private static bool StatesFilter(object state) => state is States states && !states.Country;
        private static bool CountryFilter(object state) => state is States states && states.Country;

public static ObservableCollection<States> States { get; set; } = new ObservableCollection<States>();

        public static ICollectionView StateCollectionView { get; set; }
        public static ICollectionView CountryCollectionView { get; set; }
StateCollectionView=CollectionViewSource.GetDefaultView(状态);
CountryCollectionView=CollectionViewSource.GetDefaultView(状态);
StateCollectionView.Filter+=StatesFilter;
CountryCollectionView.Filter+=CountryFilter;
公共静态void GetStates()
{
状态。清除();
使用var conn=newsqlconnection(Settings.Default.ConnectionString);
conn.Open();
string qry=“SELECT*FROM dbo.State”;
var cmd=新的SqlCommand(qry,conn);
var reader=cmd.ExecuteReader();
while(reader.Read())
{
添加(新状态(读卡器));
}
康涅狄格州关闭();
}
私有静态bool StatesFilter(对象状态)=>状态为States&&!国家;
私有静态bool CountryFilter(对象状态)=>状态为States和States.Country;
公共静态ObservableCollection状态{get;set;}=new ObservableCollection();
公共静态ICollectionView StateCollectionView{get;set;}
公共静态ICollectionView CountryCollectionView{get;set;}

您实际上并不是在过滤
可观察集合
源集合,而是它的一个视图。但问题是WPF总是与此绑定

因此,您应该创建另一个(未过滤的)
ICollectionView
,并绑定到此控件,而不是将一个控件直接绑定到
observateCollectionView
,而不是将另一个控件绑定到已过滤的
ICollectionView
。另一个选项是创建两个独立的源集合,并仅过滤其中一个

如果使用两个
icollectionview
,则需要使用两种不同的方法分别过滤它们:

private static bool StatesFilter(object state) => state is States states && !states.Country;
private static bool CountryFilter(object state) => state is States states && states.Country;
请注意,您需要使用构造函数创建视图,而不是调用
CollectionViewSource.GetDefaultView

StateCollectionView = new ListCollectionView(States);
CountryCollectionView = new ListCollectionView(States);

你能帮我多了解一点吗?我已经有了一个
observateCollection
和一个
ICollectionView
。我不知道你在说什么?创建3个不同的集合?2个已过滤,1个未过滤?两个
ICollectionView
-一个已过滤,一个未过滤-和一个
ObservableCollection
,或者只有两个
ObservableCollections
-一个已过滤,一个未过滤。是的,这就是我正在尝试做的。2
ICollectionView
使用一个
ObservableCollection
我只是在创建
ICollectionView
以按
国家或
州进行过滤时遇到了问题。您意识到您需要两个独立的过滤方法吗?是的,如果您能帮助我使用一个,我将能够掌握如何进行过滤并创建另一个。另外,我还需要另一个系列。只是想知道我会怎么做。