Pregunta

Estoy escribiendo .NET3.5, aplicación WPF usando la Biblioteca de aplicaciones compuestas. La aplicación se divide en varios módulos.

En el módulo de infraestructura he definido el objeto NetworkNode. El módulo de red administra una colección de NetworkNodes y usa XmlSerializer para almacenar / cargar esta colección. Hasta ahora todo funciona.

Pero tengo otros módulos, por ejemplo, NodeModule. Si se seleccionó un NetworkNode en el módulo de red, se publica un evento en otros módulos mediante EventAggregator. Estos módulos pueden adjuntar diversa información al NetworkNode usando las propiedades adjuntas.

El problema es que NetworkModule no conoce los otros módulos, por lo tanto, estas propiedades no están serializadas. ¿Es posible de alguna manera enumerar y serializar todas las propiedades adjuntas a un objeto? ¿O tengo que cambiar el concepto y usar algo más que propiedades adjuntas?

Saludos

¿Fue útil?

Solución

Puede enumerar todas las propiedades de dependencia (adjuntas o no) definidas en un objeto utilizando DependencyObject.GetLocalValueEnumerator :

    LocalValueEnumerator propEnumerator = foo.GetLocalValueEnumerator();
    while (propEnumerator.MoveNext())
    {
        Console.WriteLine ("{0} = {1}",
                           propEnumerator.Current.Property.Name,
                           propEnumerator.Current.Value);
    }

Sin embargo, esto no ayudará para la serialización XML (a menos que implemente IXmlSerializable, lo cual es una molestia ...). Probablemente debería usar XamlWriter en cambio (lo que supongo es de lo que Drew estaba hablando, ya que no hay XamlSerializer ...)

Otros consejos

Dado que las propiedades adjuntas no son visibles desde una perspectiva CLR pura, XmlSerializer no tiene forma de conocerlas. Tendría que cambiar para usar la arquitectura XamlSerializer para poder serializar ambos "sin formato" Los objetos CLR además de tener el conocimiento especial de DependencyObjects.

Si está utilizando .Net 4.0 (creo que no están en .Net 3.5)

Puede usar IAttachedPropertyStore o AttachablePropertyServices

Ejemplo de referencia # 1: http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore -and-AttachablePropertyservices.aspx

Además, en general, la propiedad adjunta debe definirse correctamente:

  1. Debe ser propiedad de un tipo no anidado público (u obras internas en algunos escenarios) (es decir, no se declara dentro de otro tipo), T.
  2. Defina un nuevo AttachableMemberIdentifier (T, " MyProperty ")
  3. Proporcionar métodos estáticos públicos en T llamados " SetMyProperty " y '' GetMyProperty '', es decir, '' MyProperty '' La parte debe coincidir con su AttachableMemberIdentifier. (No puede usar '' Foo '' como nombre en AttachableMemberIdentifier y llamarlos '' SetBar '' y '' GetBar '' porque la pila del serializador Xaml necesita encontrarlos por reflexión). Estos métodos deberían aprovechar AttachablePropertyServices para almacenar el valor de propiedad adjunto.

Ejemplo de referencia # 2: http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-2-putting-it-together.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top