Pergunta

OK assim que eu quero ObservableCollection subclasse para adicionar uma propriedade a ele. Infelizmente o evento PropertyChanged está protegida. Basicamente eu quero subclasse-lo para ter uma SelectedItem que eu posso ligar a para listas em meu aplicativo MVVM WPF.

Aqui está o esqueleto de minha classe:

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

Mas eu não posso fazer o seguinte:

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

por causa de restrições de acesso. Isso faz com que me fazer uma pergunta mais profunda. Como é que a interface do usuário pode ser notificado de eventos PropertyChanged (por exemplo. Contagem propriedade) e eu não posso fazê-lo em code-behind?

Minha cabeça está girando, alguém por favor pode me esclarecer?

Foi útil?

Solução

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

implementos INotifyPropertyChanged explicitamente , o que significa que você tem que converter a instância para a interface antes de poder acessar métodos, propriedades e eventos da interface. Quanto ao porquê de isso for feito, eu não sei. A Encadernação marcação extensio n não " sabe" ObservableCollections ou qualquer outro tipo. Ele verifica os tipos para ver se eles implementar ou estender interfaces específicas / classes base (INPC, INCC, DependencyObject, etc) e assim não se importa se a interface é implementada explicitamente.

Outras dicas

ObservableCollection (int .NET 3.5) aparece para implementar o evento PropertyChanged em uma interessante maneira .

protected event PropertyChangedEventHandler PropertyChanged;

event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;

Isto significa que os protegidos PropertyChanged evento é provável que apenas feito para ser usado para a implementação interna. A outra INotifyPropertyChanged.PropertyChanged evento é o que realmente cumpre a implementação do INotifyPropertyChanged interface como um interface explícita . Estranhamente eu não vejo qualquer lugar dentro do ObservableCollection onde o INotifyPropertyChanged.PropertyChanged é realmente levantada. Isso pode sinalizar que este era um bug no .NET 3.5, embora eu não tenha testado para confirmar se, por exemplo, uma propriedade mudou evento é gerado para o conde quando um item é adicionado a uma coleção, mas que parece ser como ele é suposto trabalho .

Na aplicação .NET 4.0, parece que o INotifyPropertyChanged.PropertyChanged evento em vez dos ganchos para as mesmo delegado privada usada pela protegido PropertyChanged evento que pode ter sido um erro consertar. Também é possível que este é apenas devido ao diferenças na forma como implementações auto evento são tratadas em .NET 4.0 .

Correção: Tenho verificado que o INotifyPropertyChanged.PropertyChanged evento é gerado por ObservableCollection assim os pressupostos que eu fiz acima com base em resultados de usar refletor de olhar para a implementação ObservableCollection deve ser imprecisa. Meu palpite é que refletor está fazendo algo estranho bug não tenho nenhuma prova de que ainda.

Assim, para obter o seu exemplo para o trabalho que você precisa escrever para que este trabalho seria parecido com o exemplo abaixo, assim como Will demonstrou em sua resposta.

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

direito interessante? Usando interfaces explícitas é usado principalmente para evitar colisões inevitáveis ??em membros necessários para uma determinada interface, mas eles podem ser usados ??para em um hide sentido a existência de um membro.

Se você gostaria de eventos de alteração de propriedade aumento para suas próprias propriedades personalizadas que você introduz em seu olhar subclasse para substituir e / ou chamar o OnPropertyChanged método protegido que ObservableCollection também implementa. Esta técnica é um padrão bem adotada e permite que subclasses para eventos aumentar ou eventos alça sem ter acesso ao delegado do evento subjacente. É geralmente preferido usar esta técnica também pela maneira em vez de ter um manipuladores de eventos subclasse gancho para o seu próprio eventos classes base. Para mais exemplos olhar como eventos em vários controles são implementados em WinForms e WPF.

Eu tentei adicionar uma nova propriedade no

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

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

Eu realmente não notei que PropertyChanged é definido como protegido . Finalmente mudou Val propriedade para ViewModel.

A interface do usuário pode e não ser notificado. Esta é uma restrição APENAS com ObservableCollection, que define o evento PropertyChanged como protegidos.

FWIW, eu acho que você é melhor fora de deixar ObservableCollection sozinho e apenas adicionando outro imóvel para o seu VM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top