过滤内部机构
本文关键字:内部机构 过滤 | 更新日期: 2023-09-27 18:29:58
我有复选框:
<CheckBox Name="Filtering" Grid.Row="1" Grid.Column="1"
Checked="AddFiltering" Unchecked="RemoveFiltering"
Margin="8" Style="{StaticResource checkBoxStyle}">Show only bargains</CheckBox>
我有AddFiltering方法:
private void AddFiltering(object sender, RoutedEventArgs args)
{
listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);
}
我有ShowOnlyBargains方法:
private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e)
{
AuctionItem product = e.Item as AuctionItem;
if (product != null)
{
// Filter out products with price 25 or above
if (product.CurrentPrice < 25)
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
}
我在这里也有一个问题:-)
ShowOnlyBargainsFilter返回void。它真正改变的只是参数值,即:
e.接受=真;
我想这个更改是发送回某种来电者的吗?它是如何工作的?
谢谢!
您显然是从MSDN获得代码的,所以我将尝试解释这是如何工作的。请注意,如果在CollectionViewSource
上使用Reflector,代码可能会有所不同,因为这只是对它们正在做什么的粗略猜测。
因此,由于.NET(C#)通过引用传递对象,因此当引发事件时,您将修改与事件中发送的原始CollectionViewSource
相同的对象。这意味着它可以在所有EventHandler
完成之后读取状态。这意味着它可以有这样的过滤代码:
private void ApplyFilter()
{
List<object> acceptedItems = new List<object>();
foreach (object o in this.innerCollection)
{
FilterEventArgs e = new FilterEventArgs(o);
Filter(this, e); // raise the Filter event
if (e.Accepted)
acceptedItems.Add(o);
}
this.filteredItems = acceptedItems;
}
当CollectionViewSource
引发Filter
事件时,将调用与该事件一起注册的任何事件处理程序。.NET中的事件也是MSDN中描述的一个概念。该链接来自.NET的第一个版本,但仍然适用。如果需要更多信息,也可以查找多播委托,因为该事件是多播委托的特殊情况。
这是一个简短的例子:
namespace Streamtest
{
class Program
{
static void Main(string[] args)
{
Test cTest = new Test();
cTest.Name = "Hello!";
Do(cTest);
Console.WriteLine(cTest.Name);
Console.ReadLine();
}
static void Do(Test Test)
{
Test.Name = Test.Name + " " + Test.Name;
}
}
public class Test
{
public string Name
{
get;
set;
}
}
}