0

Я пишу программу на c#, wpf по паттерну mvvm. Возник вопрос, как передать данные из одной viewmodel в другую. Перерыл кучу похожих статей, но так и не смог разобраться.

У меня есть View, которая содержит информацию о поставках, при нажатии на кнопку появляется UserControl, в котором можно изменять выбранную, на предыдущем UserControl, запись.

    //Поле и свойство выбираемой записи
    private SupplyModel _selectedSupply;
    public SupplyModel SelectedSupply
    {
        get => _selectedSupply;
        set
        {
            _selectedSupply = value;
            OnPropertyChanged(nameof(SelectedSupply));
        OnPropertyChanged(nameof(SelectedSupplyWorkers));
    }
}

//Команда для отображения view для редактирования
private void ExecuteShowAddSupplyCommand(object? obj)
{
    CurrentChildView = new EditSupplyViewModel();
    IsEnabled = false;
    BackVisibility = Visibility.Visible;
}

Соответственно вопрос, как я могу передать SelectedSupply из SupplyViewModel в EditSupplyViewModel? UserControl отображается в ContentControl

    <ContentControl HorizontalAlignment="Right"
                    Width="{Binding ActualWidth, ElementName=WidthDockPanel}"
                    Content="{Binding CurrentChildView}">

<UserControl.Resources> <DataTemplate DataType="{x:Type viewmodel:EditSupplyViewModel}"> <local:EditSupplyView/> </DataTemplate> </UserControl.Resources>

  • ну вы же сами в коде создаете EditSupplyViewModel - ну так передайте ему что нужно – vitidev Mar 22 '23 at 19:30
  • Пробовал. Либо делал, что то не правильно либо так не работает. В EditSupplyViewModel нужно создавать два конструктора, один будет принимать аргументы, а другой нет, так как view ругается, когда во viewmodel нет конструкторов не принимающих значение. И когда происходит инициализация EditSupplyView, она создает новый EditSupplyViewModel, который уже будет пустой. Вполне вероятно, что я делаю, что то не так и мне нужно передать созданный EditSupplyViewModel в контекст второй view, но я не знаю как. – oLaDushek Mar 22 '23 at 19:47
  • view ругается на конструктор только тогда когда вы в дизайнере пытаетесь скормить ему DataContext. для этого есть d:DataContext...IsDesignTimeCreatable=False. В рантайме такое будет если создавать DataContext прямо во вью - но это "стрелять себе по ногам". – vitidev Mar 22 '23 at 19:50
  • @vitidev Вау... это действительно сработало, все оказалось намного проще, чем я думал. Еще маленький вопрос, если не затруднит. Значит, задавать контекст следующим образом плохая идея, верно? <UserControl.DataContext> <viewmodel:SupplyViewModel/> </UserControl.DataContext> – oLaDushek Mar 22 '23 at 19:58
  • Угу. Это и есть "стрелять себе по ногам". На старте приложения нет проблем создать DataContext и добавить его окну, а потом и не нужно ибо там уже сплошные DataTemplate. Ну разве что диалоги - но там то же самое, что и для первого окна. Проблема с дизайнером при вьюмоделях без пустых конструкторов? ну да есть. Но мне лучше жесткий контракт, чем добавление пустого конструктора и фейковых данных. Тем более что с d:Prop стало легче жить – vitidev Mar 22 '23 at 20:05
  • @vitidev Понял, спасибо большое. Жаль комментарий нельзя отменить, как ответ – oLaDushek Mar 22 '23 at 20:07
  • https://ru.stackoverflow.com/a/562586/220553 – EvgeniyZ Mar 22 '23 at 21:54

0 Answers0