我有一个数据网格,需要在两个不同的事件时间代表两种类型的数据集。
在表单加载时-数据网格显示不带任何过滤功能的modelclasswithcombobox
单击按钮-数据网格显示带有过滤功能的modelclasswithcombobox (所以我打算在这里过滤modelclasswithcombobox并在事件中显示它)
XAML:
<DataGrid Height="150" x:Name="datagrid1" AutoGenerateColumns="True" CanUserAddRows="False" Width="467" Margin="299,-135,40,9" HorizontalAlignment="Left">
<DataGrid.Style>
<Style TargetType="{x:Type DataGrid}">
<Setter Property="ItemsSource" Value="{Binding Populatedatagridwithobservablecollection.modelclasswithcombobox}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Isauditorsearch}" Value="True">
<Setter Property="ItemsSource" Value="{Binding Populatedatagridwithobservablecollection._CarListView}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Style>
</DataGrid>
在线阅读后,我了解了用于过滤目的的ICollectionView过滤。
public interface INofificationActionfordatagrid
{
ObservableCollection<datagridmodel> modelclasswithcombobox { get; set;}
ICollectionView _CarListView { get; }
void getdatausinglinq();
}
public class PopulateDatagrid : INofificationActionfordatagrid
{
public ObservableCollection<datagridmodel> modelclasswithcombobox { get; set; }
//get { return CollectionViewSource.GetDefaultView(modelclasswithcombobox); } set { OnPropertyChanged("_CarListView");
public ICollectionView _CarListView { get; set; }
public void Filterbind(string an)
{
getdatausinglinq();
this._CarListView = CollectionViewSource.GetDefaultView(modelclasswithcombobox);
this._CarListView.Filter = item =>
{
datagridmodel vitem = item as datagridmodel;
return vitem != null && vitem.UserName.Contains(an);
};
this._CarListView.Refresh();
}
public void getdatausinglinq()
{
//ItemsView.Filter = new Predicate<object>(o => Filter(o as datagridmodel));
using (Operations_Productivity_ToolEntities context = new Operations_Productivity_ToolEntities())
{
var a1 = from t1 in context.Test_ImportedAuditdata
where t1.status == "Pending"
select t1;
if (modelclasswithcombobox == null)
modelclasswithcombobox = new ObservableCollection<datagridmodel>();
foreach (var a in a1)
{
modelclasswithcombobox.Add(new datagridmodel
{
AuditId = a.AuditId.ToString(),
Claimnumber = a.ClaimNumber.ToString(),
UserName = a.username,
CreateDate = a.Created_Date.ToString(),
ID = a.id.ToString(),
Status = a.status
});
}
context.SaveChanges();
}
}
}
public class Reassignseperately
{
PopulateDatagrid getdata = new PopulateDatagrid();
public void Reassignsep(string getitem1, ViewModel an1)
{
an1.Isauditorsearch = true;
getdata.Filterbind(getitem1);
}
}
public class ViewModel : INotifyPropertyChanged
{
INofificationActionfordatagrid
_populatedatagridwithobservablecollection = new PopulateDatagrid();
public INofificationActionfordatagrid
Populatedatagridwithobservablecollection
{
get
{
return _populatedatagridwithobservablecollection;
}
set
{
if (value != _populatedatagridwithobservablecollection)
{
_populatedatagridwithobservablecollection = value;
OnPropertyChanged("Populatedatagridwithobservablecollection");
}
}
}
private bool _Isauditorsearch;
public bool Isauditorsearch
{
get { return this._Isauditorsearch; }
set
{
if (this._Isauditorsearch != value)
{
this._Isauditorsearch = value;
OnPropertyChanged("Isauditorsearch");
}
}
}
private string _CurrentItem3;
public string Currentcomboboxitem3
{
get { return this._CurrentItem3; }
set
{
if (this._CurrentItem3 != value)
{
this._CurrentItem3 = value;
OnPropertyChanged("Currentcomboboxitem3");
}
}
}
public ViewModel()
{
Isauditorsearch = false;
ReassignusersSeperately = new RelayCommand(o =>
sep.Reassignsep(Currentcomboboxitem3, this));
}
}
但是问题是过滤后的值未与xaml绑定。我可以在_carlistview.currentItem上的断点的帮助下看到结果是预期的。但是在显示数据网格时,即使标题也没有显示。
我还发现筛选不适用于数据触发器绑定。
有人可以帮我解决这个问题。