문제

좋아, 그래서 나는 서브클래싱을 하고 싶다 ObservableCollection 속성을 추가합니다.불행하게도 PropertyChanged 이벤트가 보호됩니다.기본적으로 나는 그것을 하위 클래스로 분류하고 싶습니다. SelectedItem MVVM WPF 앱의 목록에 바인딩할 수 있습니다.

내 수업의 뼈대는 다음과 같습니다.

public class SelectableList<T> : ObservableCollection<T>
{
    public T SelectedItem {get;set;}
}

하지만 다음과 같은 작업은 수행할 수 없습니다.

SelectableList<int> intList = new SelectableList<int>();
intList.PropertyChanged += new PropertyChangedEventHandler(intList_Changed);

접근제한 때문입니다.이로 인해 저는 더 깊은 질문을 하게 되었습니다.UI가 어떻게 알림을 받을 수 있나요? PropertyChanged 이벤트(예:속성 계산) 코드 숨김에서는 이를 수행할 수 없나요?

내 머리가 돌고 있는데 누군가 나에게 가르쳐 줄 수 있습니까?

도움이 되었습니까?

해결책

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

관측형 수집 inotifypropertychanged를 명시 적으로 구현합니다, 인터페이스의 메소드, 속성 및 이벤트에 액세스하기 전에 인스턴스를 인터페이스에 캐스팅해야합니다. 이것이 왜 끝났는지, 나는 모른다. 그만큼 바인딩 마크 업 Extension은 관측형 수집 또는 기타 유형을 "알"하지 않습니다. 유형을 확인하여 특정 인터페이스/기본 클래스 (INPC, INCC, AppeendencyObject 등)를 구현하거나 확장하는지 확인하므로 인터페이스가 명시 적으로 구현되었는지 여부는 신경 쓰지 않습니다.

다른 팁

ObservableCollection(int .NET 3.5)은 PropertyChanged 이벤트를 구현하는 것으로 보입니다. 흥미로운 방법.

protected event PropertyChangedEventHandler PropertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;

즉, 보호받는 속성이 변경되었습니다. 이벤트는 내부 구현에만 사용될 가능성이 높습니다.다른 INotifyPropertyChanged.PropertyChanged 이벤트는 실제로 구현을 수행하는 이벤트입니다. INotifyPropertyChanged 인터페이스 명시적 인터페이스.이상하게도 ObservableCollection 내에서 INotifyPropertyChanged.PropertyChanged 실제로 제기됩니다.예를 들어 항목이 컬렉션에 추가될 때 속성 변경 이벤트가 Count에 대해 발생하는지 여부를 확인하기 위해 테스트하지는 않았지만 이것이 .NET 3.5의 버그라는 신호일 수 있지만 이것이 작동하는 방식인 것처럼 보입니다. .

.NET 4.0 구현에서는 INotifyPropertyChanged.PropertyChanged 대신 이벤트는 protected에서 사용하는 것과 동일한 개인 대리자에 연결됩니다. 속성이 변경되었습니다. 버그 수정일 수 있는 이벤트입니다.단지 이것 때문일 수도 있습니다. .NET 4.0에서 자동 이벤트 구현을 처리하는 방법의 차이점.

보정: 나는 그것을 확인했다 INotifyPropertyChanged.PropertyChanged 이벤트는 ObservableCollection에 의해 발생하므로 ObservableCollection 구현을 살펴보기 위해 Reflector를 사용한 결과를 기반으로 위에서 만든 가정은 부정확해야 합니다.내 생각엔 반사경이 이상한 버그를 일으키고 있는 것 같은데 아직 증거가 없습니다.

따라서 귀하의 예가 작동하도록 하려면 Will이 그의 답변에서 시연한 것처럼 아래 예와 같이 작동하도록 작성해야 합니다.

SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged += 
    new PropertyChangedEventHandler(intList_Changed);

흥미롭죠?명시적 인터페이스를 사용하는 것은 주어진 인터페이스에 필요한 멤버의 불가피한 충돌을 피하기 위해 주로 사용되지만 어떤 의미에서는 멤버의 존재를 숨기는 데 사용될 수도 있습니다.

서브클래스에 도입한 사용자 정의 속성에 대한 속성 변경 이벤트를 발생시키려면 보호된 속성을 재정의 및/또는 호출하는 방법을 살펴보십시오. 속성이 변경됨 ObservableCollection도 구현하는 메서드입니다.이 기술은 잘 채택된 표준이며 하위 클래스가 기본 이벤트 대리자에 액세스하지 않고도 이벤트를 발생시키거나 이벤트를 처리할 수 있게 해줍니다.그런데 일반적으로 자체 기본 클래스 이벤트에 대한 하위 클래스 후크 이벤트 핸들러를 사용하는 대신 이 기술을 사용하는 것이 좋습니다.더 많은 예제를 보려면 WinForms 및 WPF에서 다양한 컨트롤의 이벤트가 구현되는 방법을 살펴보세요.

새로운 속성을 추가하려고했습니다

public class ResultCollection<T> : ObservableCollection<T>
{

        Boolean _val;
        public Boolean Val
        {   
            get
            {   
                return _val;
            }
            set
            {   
                _val= value;
                OnPropertyChanged(new PropertyChangedEventArgs("Val"));
            }
        }
}

나는 정말로 그것을 눈치 채지 못했습니다 속성 변경 정의됩니다 보호. 마지막으로 Val 속성을 ViewModel로 옮겼습니다.

UI는 통지 할 수 있고 있습니다. 이것은 제한입니다 단지 PropertyChanged 이벤트를 보호 된 것으로 정의하는 관측형 수집으로.

fwiw, 나는 당신이 관찰 정책 수집 만 남기고 VM에 다른 속성을 추가하는 것이 좋습니다.

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