Всем добрый день! Появилась следующая проблема, необходимо создать MenuControl, состоящий из XAML-разметки (стандартной)
<UserControl x:Class="ControlsLibrary.Views.MenuControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vm="clr-namespace:ControlsLibrary.ViewModels"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.DataContext>
<vm:MenuControlViewModel/>
</UserControl.DataContext>
<Grid/>
</UserControl>
, MenuControl.cs (стандартный)
public partial class MenuControl : UserControl
{
public MenuControl()
{
InitializeComponent();
}
}
и MenuControlViewModel.cs (пустой класс)
public class MenuControlViewModel
{
public MenuControlViewModel(IMediator m)
{}
}
, при этом MenuControlViewModel должен быть задан как DataContext. Так же MenuControlViewModel должен иметь конструктор, принимающий экземпляр интерфейса IMediator в качестве параметра. Передачу в конструктор параметра сделал с помощью DependencyInjection:
private readonly IHost _host;
public Register()
{
_host = Host.CreateDefaultBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton<MainWindow>();
services.AddSingleton<IMediator, Mediator>();
}).Build();
}
public void OnStartup(object sender, StartupEventArgs e)
{
using var serviceScope = _host.Services.CreateScope();
var window = serviceScope.ServiceProvider.GetService<MainWindow>();
window.Show();
}
Во всём остальном коде DI работает. Но есть проблема: т.к. MenuControlViewModel должен быть DataContext, то нужно его где-то задать. Если задавать в XAML – будет ошибка, т.к. нельзя передать ничего в качестве параметра. Если задавать в MenuControl.cs, то нужно передать параметры в MenuControl.cs, Но будет ошибка – UserControl запускается только со стандартным конструктором, без параметров.
при этом MenuControlViewModel должен быть задан как DataContext- не должен, это нарушение MVVM, а также вообще проектирования в целом, ведь контролы должны быть универсальны и самостоятельны, а не зависеть от некогоMenuControlViewModel. Вот задайте себе вопрос - простойTextBoxпросит от вас создание дополнительного класса для работы? Нет, он имеет органы управления (Textнапример), через который он и понимает, что выводить. А у вас, что будет если удалить этот класс? Запустится ли проект? Нет... – EvgeniyZ Oct 03 '21 at 19:04TextBox, у вас не должно быть, что внутри у него прописан свойDataContextиз которого он читает текст, нет, он должен быть самостоятельны, со своим дизайном и дизайн-логикой, а данные, он берет из вне через привязку (<TextBox Text = "{Binding SomeText}">) – EvgeniyZ Oct 04 '21 at 06:07CustomMenuViewModel), что, будете делать еще один контрол, дублировать код, лишь чтоб изменить там данные? Ну согласитесь, что-то тут не то... Касательно окна - не путайте то, что вы задаетеDataContextиз вне (использование контрола) и то, что вы задаете его внутри (при реализации). – EvgeniyZ Oct 04 '21 at 06:13