我构建了一个用户控件,该控件向每个datagrid列添加了一个过滤器。我的datgrid绑定为一个自定义类,绑定为CollectionViewSource以允许多个过滤器。 用户控件会在每个列标题上添加一个小按钮,单击该按钮时将为用户提供用于过滤该列的过滤器选项。 用户控件遍历视觉树以达到使其可重用所需的条件。我发现的问题是我无法应用来自两个不同列的过滤器,因为过滤器方法的名称相同,但是用户控件的实例不同。
这是我在用户控件中应用过滤器的方式。 propName是用户控件内的一个公共变量,用于设置用户控件绑定到的列的名称(再次遍历VisualTree以获取该名称)。因此,我然后在过滤器中使用该过滤器根据该列进行过滤,从而使我能够在用户控件中进行所有过滤。
if(filterApplied == true)
{
CVS_DG2.Filter -= new FilterEventHandler(CVS_DG_Filter);
CVS_DG2.Filter += new FilterEventHandler(CVS_DG_Filter);
}
else
{
CVS_DG2.Filter += new FilterEventHandler(CVS_DG_Filter);
filterApplied = true;
}
这是我的用户控件中的过滤器方法
private void CVS_DG_Filter(object sender, FilterEventArgs e)
{
dynamic src = e.Item;
var propertyInfo = src.GetType().GetProperty(propname);
var value = propertyInfo.GetValue(src, null);
if (value.Contains(tempfilter1Value))
{
}
else
{
e.Accepted = false;
}
}
当我将过滤器应用于一列时,它的效果很好。但是当我将另一个过滤器应用于另一列时,没有考虑第一个过滤器。
在测试了几件事之后,我发现如果我复制了用户控件并更改了过滤器方法的名称,则过滤将可以正常进行。即使filter方法位于用户控件的不同实例中,它的效果也一样,CollectionViewSource仍将其视为相同的过滤器。
请提供任何解释/帮助/建议/替代方案?