0

Почему родительский ViewModel в дочернем становится null ?

Для взаимодействия между дочерней и родительской ViewModel, я передал ссылку на родительскую ViewModel в дочернюю ViewModel .

Когда вовремя отладки я открываю окно ManagerIndexesViewModel.IndexesViewModel, то член ManagerIndexesViewModel, который находится в IndexesViewModel не равен нулю.

Когда я вбираю строку в IndexesView.DataGrid, то в свойстве SelectedIndexCalculation я получаю this.managerIndexesViewModel = null (в строке this.managerIndexesViewModel.SelectedIndexCalculation = SelectedIndexCalculation;).

IndexesViewModel

public IndexCalculation SelectedIndexCalculation
{
    get { return selectedIndexCalculation; }
    set 
    { 
        selectedIndexCalculation = value;
    Debug.WriteLine($"--- --- --- --- --- --- --- --- ---");
    Debug.WriteLine($"IndexesViewModel--selectedIndexCalculation -- {selectedIndexCalculation.Name}");
    this.managerIndexesViewModel.SelectedIndexCalculation = SelectedIndexCalculation;

    RaisePropertyChanged(nameof(SelectedIndexCalculation));
}

}

Проект: https://github.com/jhon65496/WpfFrmApp1QPublic


Минимальный код

ManagerIndexesViewModel

public class ManagerIndexesViewModel : BaseVM
{  
    IndexesViewModel indexesViewModel;
    //. Code ....
public ManagerIndexesViewModel()
{
    // ViewModel
    this.indexesViewModel = new IndexesViewModel(this);
    // Code
    // .....


    // View
    IndexesView = this.indexesViewModel;
    // Code
    // .....

    SelectedIndexCalculation = indexesViewModel.SelectedIndexCalculation;
}


IndexesViewModel

public class IndexesViewModel : BaseVM
{
public ManagerIndexesViewModel managerIndexesViewModel;
public IndexesViewModel(ManagerIndexesViewModel managerIndexesViewModel)
{
    this.managerIndexesViewModel = managerIndexesViewModel;

    LoadDataTest();
}


public IndexesViewModel()
{   

    LoadDataTest();
}




private ObservableCollection<IndexCalculation> calculationIndexs;

public ObservableCollection<IndexCalculation> СalculationIndexs
{
    get { return calculationIndexs; }
    set 
    { 
        calculationIndexs = value;
        RaisePropertyChanged(nameof(СalculationIndexs));
    }
}

private IndexCalculation selectedIndexCalculation;

public IndexCalculation SelectedIndexCalculation
{
    get { return selectedIndexCalculation; }
    set 
    { 
        selectedIndexCalculation = value;

        Debug.WriteLine($"--- --- --- --- --- --- --- --- ---");
        Debug.WriteLine($"IndexesViewModel--selectedIndexCalculation -- {selectedIndexCalculation.Name}");


        RaisePropertyChanged(nameof(SelectedIndexCalculation));
    }
}

введите сюда описание изображения

введите сюда описание изображения

[введите сюда описание изображения3

введите сюда описание изображения

eusataf
  • 249
  • 1
  • 8
  • 3
    В вопросе нет проблемных мест, ибо они в XAML, который вы нам не показали. Вся ваша проблема в <vvm:IndexesViewModel/> - это тоже самое, если вы сделаете DataContext = new IndexesViewModel(), и вы будете постоянно при рендере данной страницы инициализировать новый контекст, и самое важное, будет инициализироваться класс с конструктором без параметров, ну а теперь найдите в своем коде public IndexesViewModel() { .. } и посмотрите, задаете вы там managerIndexesViewModel или нет. Вообще установка контекста в XAML плохо. – EvgeniyZ Oct 18 '23 at 18:12
  • Уберите конструктор public IndexesViewModel() и узнаете, почему. – aepot Oct 18 '23 at 18:43
  • @aepot Хочу в дизайнере XAML видеть данные, а для этого нуден конструктор без параметров. Если я правильно понял... Нагородил такое: https://github.com/jhon65496/WpfFrmApp1QPublic/tree/apt01 Вроде работает... Не сильно коряво? Или пойдёт? У меня цель: просто подёргать различные приёмы. Без глубоко погружения в биндинги, MVVM, архитектуры, DI. Буду признателен за любые замечания, предложения. – eusataf Oct 18 '23 at 21:27
  • @EvgeniyZ см. выше комментарий для aepot – eusataf Oct 18 '23 at 21:28
  • Заставлять студию отображать данные в реальном времени - плохая затея. Хотите видеть в реальном времени - запустите проект и пишите с использованием Hot Reload все, что вам надо, многое будете видеть прям в реал тайме. Ну а дизайнер студии... Он очень корявый, прям очень, кучу всего до сих пор делает криво, из-за чего многие программисты попросту от него отказываются. Ну а если прям очень надо видеть в студии что-то, то делайте фейковые данные (я вроде показывал как), а не отображайте в реал тайме, ибо в реал у вас вовсе может студия виснуть (если проект большой) и делать кучу лишнего. – EvgeniyZ Oct 18 '23 at 21:32
  • 1
    Не сильно коряво? - руками окно создавать надо не в конструкторе App, а protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); ...здесь... } – aepot Oct 18 '23 at 22:39

0 Answers0