문제

속성이있는 경우 :

public list<String> names { get; set; }

이름이 목록에 추가 될 때마다 'onnameschanged'라는 인수를 위해 사용자 정의 이벤트를 생성하고 처리하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

당신은 확인해야합니다 System.componentModel.BindingList, 특히 ListChanged 이벤트.

다른 팁

Bindinglist는 변경 추적 및 다양한 기존 이벤트가 제공되므로 최선의 선택 일 수 있습니다. 아래는 BindingList 이벤트에 전달되는 ADD에 대한 사용자 정의 이벤트를 노출시키는 예입니다.


    class Example
    {
        private BindingList<string> m_names = new BindingList<string>();
        public IEnumerable<string> Names { get { return m_names; } }
        public event AddingNewEventHandler NamesAdded
        {
            add { m_names.AddingNew += value; }
            remove { m_names.AddingNew -= value; }
        }
        public void Add(string name)
        {
            m_names.Add(name);
        }
    }

Bindinglist의 대안은 다음과 같습니다 관측형 수집 -이 경우 자신의 이벤트 핸들러를 구독하고 싶습니다. CollectionChanged 행동에 따라 이벤트와 이벤트를 해고하십시오.

David Mohundro는 한 가지 접근 방식을 보여줍니다. 다른 옵션 중 하나는 컬렉션에서 상속하는 것입니다u003CT> 다양한 방법을 무시합니다.

class Foo {}
class FooCollection : Collection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        // your code...
        base.InsertItem(index, item);
    }
    protected override void SetItem(int index, Foo item)
    {
        // your code...
        base.SetItem(index, item);
    }
    // etc
}

마지막으로 자신만의 목록을 만들 수 있습니다 (Ilist, Ilistu003CT> ) 첫 번째 원칙에서 - 많은 작업, 거의 혜택이 없습니다.

비 정통 접근법은 Accessor가 호출되기 전/후에 핸들러를 "직조"하기 위해 PostSharp와 같은 AOP 프레임 워크를 사용하여 이벤트를 시작할 수 있습니다.

귀하는 귀하의 재산에 액세스 할 때 사전 및/또는 사후 처리 코드가 포함 된 외부 클래스를 만듭니다. 재산의 값이 사전과 우편 사이에 변경된 지 확인하고 이벤트를 제기하십시오.

비교 (핸들러 코드 내부)를위한 값을 취하는 동안 무한 루프에 들어갈 수 있습니다 (액세서를 호출하는 AOP 핸들러를 호출하는 속성 액세서로 호출 할 수 있으므로 필요할 수 있습니다. 후원 필드를 얻기 위해이 속성을 포함하는 클래스에 반영합니다.

목록을 속성으로 직접 노출시키지 않아도 될 필요가 없으며 클래스가 ILIST를 구현하거나 일부는 ADD () 메소드에서 이벤트 핸들러를 발사하도록 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top