0

チェックボックスがあります:

<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;

この変更は何らかの呼び出し元に送り返されていると思いますか? それはどのように機能しますか?

ありがとうございました!

4

2 に答える 2

2

あなたは明らかにMSDNからコードを入手したので、これがどのように機能するかを説明しようとします。で Reflector を使用する場合CollectionViewSource、コードは異なる可能性が高いことに注意してください。

したがって、.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 の最初のバージョンのものですが、まだ適用できます。イベントはマルチキャスト デリゲートの特殊なケースであるため、さらに情報が必要な場合は、マルチキャスト デリゲートを検索することもできます。

于 2013-09-01T14:03:20.133 に答える
1

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;
        }
    }
}
于 2013-09-01T10:34:22.287 に答える