0

Реализую WPF MVVM приложение, использую библиотеку DevExpress. Нужно добавить Ninject, вот мои классы:

public interface IConvert
{
    void SaveFile(string text, string type);
}

public class FileConvert : IConvert { ... }

Мой App.xaml.cs:

public partial class App : Application
{
    private IKernel container;
    protected override void OnStartup(StartupEventArgs e)
    {
       // IocKernel.Initialize(new IocConfiguration());
        base.OnStartup(e);
        ConfigureContainer();
        ComposeObjects();
        Current.MainWindow.Show();
    }
    private void ConfigureContainer()
    {
        this.container = new StandardKernel();
        container.Bind<IConvert>().To<FileConvert>().InTransientScope();
    }
private void ComposeObjects()
{
    Current.MainWindow = this.container.Get&lt;MainWindow&gt;();

}

}

Представление MovieListView:

  DataContext="{dxmvvm:ViewModelSource Type={x:Type ViewModels:MovieListViewModel}}"
           d:DesignHeight="400" d:DesignWidth="635">
<dxmvvm:Interaction.Behaviors>
    <dx:WindowedDocumentUIService>
        <dx:WindowedDocumentUIService.WindowStyle>
            <Style TargetType="dx:DXWindow">
                <Setter Property="Width" Value="300"/>
                <Setter Property="Height" Value="300"/>
            </Style>
        </dx:WindowedDocumentUIService.WindowStyle>
    </dx:WindowedDocumentUIService>
</dxmvvm:Interaction.Behaviors>

<Grid> ... </Grid>

MainWindow.xaml:

<dx:ThemedWindow 
x:Class="DXAppWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:views="clr-namespace:DXAppWPF.Views"
Title="MainWindow" Height="400" Width="650" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
<Grid>
    <views:MovieListView>
    </views:MovieListView>
</Grid> </dx:ThemedWindow>

И мой класс модели представления:

[POCOViewModel]
public class MovieListViewModel
{
    public virtual MovieList Movies { get; set; }
    private IConvert _convert;
[Inject]
public MovieListViewModel(IConvert convert)  //Конструктор не вызывается
{
    _convert = convert;
}
protected MovieListViewModel()
{
    Movies = new MovieList();
}
public static MovieListViewModel Create()
{
    return ViewModelSource.Create(() =&gt; new MovieListViewModel());
}

[ServiceProperty(SearchMode = ServiceSearchMode.PreferParents)]
protected virtual IDocumentManagerService DocumentManagerService { get { return null; } }


public void SaveCVS(object sender){

   _convert.SaveFile(CheckRow(sender), &quot;csv&quot;);  //Ошибка здесь, _convert пустой
}

private string CheckRow(object sender)
{
    ...
    return text;
}

}

Как сделать, чтоб конструктор MovieListViewModel(IConvert convert) в модели представления вызывался?

  • 1
    Когда вы добавляете в проект контейнер, в вашем коде сразу должны пропасть все = new(), ведь это должен делать за вас сам контейнер. Вот давайте глянем на код: .Bind<IConvert>() - зарегистрировали в контейнере тип IConvert, ок .Get<MainWindow> - получили главное окно (хотя я не вижу регистрации его в контейнере, но допусти есть), ок, а где указание окну DataContext? Далее, DataContext="{dxmvvm - зачем? Если это контрол, то он не должен быть зависим от контекста. Ну и последнее => new MovieListViewModel()); - по вашей логике вы сами должны создавать объект, а не контейнер... – EvgeniyZ Oct 21 '21 at 16:56
  • 1
    У вас по сути должно быть так: контейнер, в котором регистрируются MainWindow, IConvert, ну и MovieListViewModel. Далее вы из контейнера берете MainWindow и MovieListViewModel, который задается окну как DataContext, ну и дальше показывается окно. Все, последующие зависимости конейтейнер должен подтянуть сам как окну (если требует), так и VM. – EvgeniyZ Oct 21 '21 at 16:59
  • @EvgeniyZ DI недавно начал применять, опыта мало. Попытаюсь осмыслить все написанное, спасибо за ответ. – Нихад Бабаев Oct 21 '21 at 17:15
  • https://ru.stackoverflow.com/a/1208109/373567 другой контейнер, но суть та же. – aepot Oct 21 '21 at 17:16

0 Answers0