Pergunta

Eu estou construindo um aplicativo Silverlight e um dos meus advertências da última vez foi que, se você precisar de alguma coisa bem feito no Silverlight / WPF maneira que você precisa modelar seus objetos como um DependecyObject e usar DependencyProperty (s)

I encontrar este modelo a ser bastante complicado, exigindo campos estáticos e initializers em metade das aulas que eu uso, por isso é uma boa idéia usar o event-driven bom e velho (observador padrão?) No lugar de DependencyObject

Eu estou com o objetivo de minimizar placas bloat código e caldeiras (eu odeio eles) e realmente gostaria de saber se alguém com experiência em Silverlight / WPF tem alguma dica / técnicas para manter o uso de DependencyObject e DependencyProperty ao mínimo?

Será esta uma boa idéia?

Foi útil?

Solução

Na verdade, em Silverlight pode DependencyObjects não herda, e por isso você deve (e tem que) implementar INotifyPropertyChanged vez.

Implementação INotifyPropertyChanged tem muitas vantagens sobre DependencyObjects (vou abreviar este fazer para tornar mais fácil) e usando DependencyProperties (PD):

  • Este é mais leve
  • Permite-lhe mais liberdade na modelagem de seus objetos
  • Pode ser serializado facilmente
  • Você pode aumentar o evento quando quiser, o que pode ser útil em determinados cenários, por exemplo, quando você quer agrupar várias alterações em apenas uma operação de interface do usuário, ou quando você precisa aumentar o evento, mesmo que os dados não mudança (para forçar redesenho ...)

Por outro lado, herdando DOs em WPF tem as seguintes vantagens:

  • Mais fácil de implementar, especialmente para iniciantes.
  • Você começa um mecanismo de retorno de chamada (quase) de graça, permitindo-lhe ser notificado quando o valor da propriedade alterações
  • Você ganha um mecanismo de coerção com permite que você defina regras para max, min e valor presente da propriedade.

Há outras considerações, mas estes são os principais.

Eu acho que o consenso geral é que as PD são grandes para controles (e você pode implementar um CustomControl com DPs personalizados, mesmo em Silverlight), mas para dados de objetos você deveria implementar INotifyPropertyChanged.

HTH, Laurent

Outras dicas

Ela realmente depende de quais objetos você está se referindo. Se o objeto se destina a sentar-se na árvore XAML, o seu melhor para usar DependencyProperties (e, assim, herdar DependencyObject - que todos os UIElements fazer) para permitir que todos os benefícios que DependencyProperties fornecem (sendo animatable, encadernação, opcional herança criança automática, etc). Eu recomendo que você leia o href="http://msdn.microsoft.com/en-us/library/ms752914.aspx" rel="nofollow noreferrer"> visão geral se você paraíso' t já.

Se o objeto for uma entidade de dados (ie. Estiver a vincular seus valores a algo na árvore XAML), então não há necessidade para herdar de DependencyObject. Se as propriedades no objeto são leitura e escrita que você pode querer implementar INotifyPropertyChanged , o que permitirá ligações para atualizar automaticamente quando o valor é alterado.

Eu concordo com Richard que depende da finalidade de sua classe, mas como uma nota parece que você pode herdar de DependencyObject diretamente no Silverlight 2.0 Release, sem ter que herdar de UIElement ou UserControl. Pelo menos, eu estou fazendo isso no meu (SilverLight 2.0 RTW) aplicativo.

System.Windows.DependencyObject em MSDN

É não é típica para derivar diretamente de DependencyObject para a maioria dos cenários. Em vez disso você pode derivar de um controle específico, de uma das classes base de controle (ContentControl; Controle; ItemsControl), de FrameworkElement, ou de classes não-controle que ainda participam de UI, como Panel ou Grade. Derivando de DependencyObject pode ser apropriado se você estiver definindo um objeto de negócios ou de armazenamento de dados onde você quer propriedades de dependência para ser ativo, ou se você estiver criando uma classe de apoio de serviços que vai possuir propriedades anexadas.

HTH

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