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
-一个已过滤,一个未过滤。是的,这就是我正在尝试做的。2ICollectionView
使用一个ObservableCollection
我只是在创建ICollectionView
以按国家或州进行过滤时遇到了问题。您意识到您需要两个独立的过滤方法吗?是的,如果您能帮助我使用一个,我将能够掌握如何进行过滤并创建另一个。另外,我还需要另一个系列。只是想知道我会怎么做。