我有Checkbox:
<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.Accepted = true;
我猜这个改变会被发送回某种呼叫者? 它是如何工作的?
谢谢!
答案 0 :(得分:2)
您显然从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的第一个版本,但仍然适用。如果您需要更多信息,还可以查找多播委托,因为该事件是多播委托的特例。
答案 1 :(得分:1)
C#是一个基于参考的系统。所以你通过引用来改变对象。所以作为参数给出的对象将被直接改变。
Hiere一个简短的例子:
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;
}
}
}