Инъекция зависимости (Windsor) в WPF UserControl - PullRequest
5 голосов
/ 30 марта 2011

Использование DI в MainView не является проблемой: я добавил свои окна в свой контейнер, и при запуске я показываю мои окна, которые были извлечены из моего контейнера.Но если в мой основной вид добавлен пользовательский контроль в виде тега xaml, механизм просмотра wpf автоматически создаст для него новый экземпляр, не вытаскивая также добавленный в свой контейнер UserControl, который я добавил в механизм поиска WPF.требуется view / xamal в мой контейнер вместо создания нового?

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Нет способа сделать это без изменения вашего XAML. Можно подумать о некоторых обходных путях, например, создать элемент управления, унаследованный от ContentControl, который будет внедрять зависимости в его Content, но я бы не рекомендовал этот подход, только если у вас нет выбора.

Я бы порекомендовал использовать лучший шаблон WPF - MVVM . Идея состоит в том, чтобы иметь иерархию ViewModels, все они будут созданы с использованием контейнера IoC с правильным внедрением конструктора. Также у вас будет иерархия представлений, каждое представление будет зависеть только от соответствующей viewModel, которая будет передана в представление DataContext. Такой подход позволит вам красиво использовать DI в приложении WPF.

2 голосов
/ 30 марта 2011

Мне кажется, я понял, что вы мне предложили

<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>

, когда MainWindow извлекается из контейнера при запуске

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

, а Mainwindow выглядит как

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...