2011-03-29 31 views
5

El uso de DI en MainView no es un problema: Agregué mis ventanas a mi contenedor y en el arranque le muestro las ventanas que se sacaron de mi contenedor. Pero si tengo un usercontrol agregado a mi vista principal como etiqueta xaml, wpf view engine creará automáticamente una nueva instancia para él sin sacar el UserControl que agregué en mi contenedor también. ¿Cómo puedo forzar que el motor de vista de WPF busque el componente? requerido por view/xamal en mi contenedor en lugar de crear uno nuevo?Inyección de Dependecy (Windsor) en WPF UserControl

+1

duplicado: http://stackoverflow.com/questions/2408873/how-do-i-inject-dependencies-to-user-controls-in-wpf –

Respuesta

2

No hay forma de hacerlo sin modificar su XAML. Puede pensar en algunas soluciones, por ejemplo, crear un control heredado de ContentControl que inyectará dependencias en su Content, pero no recomendaría este enfoque, solo si no tiene otra opción.

Lo que recomendaría es utilizar el mejor patrón de WPF - MVVM. La idea es tener una jerarquía de ViewModels, todos ellos se crearán utilizando el contenedor IoC con la inyección de constructor adecuada. También tendrá una jerarquía de vistas, cada vista dependerá solo del viewModel correspondiente que se pasará a la vista DataContext. Este enfoque le permitirá usar DI en la aplicación WPF muy bien.

2

creo que entendí lo que me sugeriste

<Window x:Class="DDDSample02.Wpf.Views.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:presentation="clr-namespace:DDDSample02.Wpf.Views" 
     Title="MainWindow" Height="384" Width="821"> 
    <Grid> 
     <presentation:ProductsView DataContext="{Binding Path=ProductsPresenter}" /> 
    </Grid> 
</Window> 

donde MainWindow se saca del recipiente en el arranque

protected override void OnStartup(StartupEventArgs e) 
{ 
    GuyWire.Wire(); 
    ((Window)GuyWire.GetRoot()).Show();//MainWindow 
} 

y MainWindow parece

public partial class MainWindow : Window 
{ 

    public MainWindow(DDDSample02.ViewModel.MainWindowPresenter presenter) 
    { 
     InitializeComponent(); 
     this.DataContext = presenter; 
    } 

} 

public class MainWindowPresenter 
{ 
    public MainWindowPresenter(ProductsPresenter productPresenter) 
    { 
     this.ProductsPresenter = productPresenter; 
    } 

    public ProductsPresenter ProductsPresenter { get; private set; } 
} 
+0

Sí, eso es todo. – Snowbear

Cuestiones relacionadas