我有复选框:
<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返回空值。它真正改变的是参数值,即:
e.Accepted =真;
我猜这个更改是发回给某种调用者的?它怎麽工作?
谢谢!
发布于 2013-09-01 22:03:20
显然,您是从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事件时,将调用向该事件注册的任何事件处理程序。MSDN上也描述了.NET中的事件。该链接来自.NET的第一个版本,但仍然适用。如果需要更多信息,还可以查找多播委托,因为该事件是多播委托的特例。
发布于 2013-09-01 18:34:22
C#是一个基于引用的系统。因此,您可以通过引用更改命令"e“。因此,作为参数给定的对象将被直接更改。
这里有一个简短的例子:
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;
}
}
}https://stackoverflow.com/questions/18557507
复制相似问题