2011-12-29 7 views
6

que tiene un control de usuario que he creado que importa varias partes utilizando el atributo [Import].Usando MEF en los controles instanciados de XAML

public class MyUserControl : UserControl, IPartImportsSatisfiedNotification 
{ 
    [Import] 
    public IService Service { get; set; } 

    public MyUserControl() 
    { 
    } 

    public void OnImportsSatisfied() 
    { 
     // Do something with Service. 
    } 
} 

Este control de usuario se crea una instancia de XAML, por lo que sus importaciones no están siendo satisfechas y OnImportsSatisfied no se está llamando.

<local:MyUserControl /> 

Mi pregunta es cómo puedo satisfacer las importaciones de mi clase cuando se está creando en XAML.

+0

que podría ser difícil de hacer, porque por lo general se descarga WPF controles que no son visibles, por lo que este control sólo puede existir una vez, pero puede ser que consiga cargado y descargado varias veces. – Rachel

+0

@Rachel para evitar eso, podría usar cargas perezosas. –

+0

¿Estás seguro de que esto es lo correcto? Parece que está intentando poner la lógica empresarial en el control de la interfaz de usuario. Lo cual siempre es malo. – Euphoric

Respuesta

2

De MSDN:

para ejecutarse como un elemento de objeto en XAML, una clase personalizada debe cumplir con los siguientes requisitos:
La clase personalizada debe ser pública y debe exponer un defecto (sin parámetros) pública constructor. (Consulte la siguiente sección para obtener las notas sobre las estructuras).
La clase personalizada no debe ser una clase anidada. El "punto" adicional en la ruta de nombre completo hace que la división del espacio de nombres de clase sea ambigua, y interfiere con otras características de XAML, como las propiedades adjuntas.
Si un objeto se pueden crear instancias como un elemento de objeto, el objeto creado puede llenar el formulario de elemento de propiedad de cualquier propiedad que tienen el objeto como su tipo subyacente.
Puede proporcionar los valores de objeto para los tipos que no cumplan estos criterios, si habilita un convertidor de valor . Para obtener más información, vea Conversor de tipos y Marcado Extensiones para XAML.

A partir de ahí, usted tiene dos opciones:
1) Usando un TypeConverter:
El uso de un convertidor de tipos le permitirá crear un objeto sin un constructor sin parámetros, pero tendrá que proporcionar una TypeConverter que hará la instanciación.

Ahora, nunca he tenido que usarlo, no puedo ayudar aún más con eso.

2) Recuperar IService utilizando el ServiceLocator:

public class MyUserControl : UserControl 
{  
    public IService Service { get; set; } 

    public MyUserControl() 
    { 
     Service = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IService>(); 
     // You can do something with Service here already. 
    } 
} 

Me di cuenta que es un cambio en el diseño de su clase, pero es de esperar que pueda hacer frente a ella.

Espero que esto ayude,

Bab.

0

si no quiere MEF para crear su usercontrol, usted tiene que utilizar el compositioncontainer en su control de usuario y llamar a GetExport directa. pero entonces usted tiene el problema de obtener la instancia de su compositioncontainer :)

ps: i le permiten crear mef mis puntos de vista de WPF en mis aplicaciones.

Cuestiones relacionadas