首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >过滤内部机制

过滤内部机制
EN

Stack Overflow用户
提问于 2013-09-01 18:29:20
回答 2查看 150关注 0票数 0

我有复选框:

代码语言:javascript
复制
<CheckBox Name="Filtering" Grid.Row="1" Grid.Column="1" 
    Checked="AddFiltering" Unchecked="RemoveFiltering" 
    Margin="8" Style="{StaticResource checkBoxStyle}">Show only bargains</CheckBox>

我有AddFiltering方法:

代码语言:javascript
复制
private void AddFiltering(object sender, RoutedEventArgs args)
{
    listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);   

}

我有ShowOnlyBargains方法:

代码语言:javascript
复制
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 =真;

我猜这个更改是发回给某种调用者的?它怎麽工作?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-09-01 22:03:20

显然,您是从MSDN获得代码的,所以我将尝试解释它是如何工作的。请注意,如果您在CollectionViewSource上使用Reflector,代码可能会有所不同,因为这只是对它们正在做什么的粗略猜测。

因此,由于.NET (C#)通过引用传递对象,因此在引发事件时,您将修改原始CollectionViewSource在事件中发送的同一对象。这意味着它可以在所有EventHandler完成后读取状态。这意味着它可以有像这样的过滤代码:

代码语言:javascript
复制
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的第一个版本,但仍然适用。如果需要更多信息,还可以查找多播委托,因为该事件是多播委托的特例。

票数 2
EN

Stack Overflow用户

发布于 2013-09-01 18:34:22

C#是一个基于引用的系统。因此,您可以通过引用更改命令"e“。因此,作为参数给定的对象将被直接更改。

这里有一个简短的例子:

代码语言:javascript
复制
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;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18557507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档