0

Имеется класс CardModel

class CardModel : ObservableObject 
    {
        private string _sh;
    public string Sh
    {
        get { return _sh; }
        set { _sh = value;
            OnPropertyChanged();
        }
    }

    private string _equip;

    public string Equip
    {
        get { return _equip; }
        set { _equip = value; }
    }


    public CardModel()
    {

    }

}

Имеется форма Card, на ней есть TextBox, который биндит Sh:

<TextBox x:Name="testTB" Text="{Binding Path=Sh, UpdateSourceTrigger=PropertyChanged}"  Height="30" Margin="481,20,-279,380" FontSize="20"/>

У формы есть DataContext

<Window.DataContext>
        <local1:CardModel/>
    </Window.DataContext>

Когда форма открывается, в неё передается sh типа long. И если в инициализации формы написать textbox.text = sh.ToString(); то все работает. Но это неправильно. Я хочу, чтобы textbox биндил данные из DataConext. Я пытаюсь сделать так:

public Window1(long sh)
        {
            InitializeComponent();
            DataContext = new CardModel();
            CardModel card = new CardModel();
            card.Sh = sh.ToString();
        }

Но textbox'у вообще пофигу. Но если запустить цикл с перезаписью переменной внутри CardModel, то textbox вообще с радостью все будет отображать.

Так вот вопрос: как, следуя паттерну MVVM сделать так, чтобы при открытии новой формы, в которую передается инфо с родительской формы, эта информация отображалась в textbox

  • 1
    Когда вы пишете <local1:CardModel/> - вам создает View слой за вас этот класс, инициализируя его значениями по умолчанию. Когда вы делаете = new CardModel() - каждый раз, когда вы пишете new, вы делаете новый класс, который не связан каким-либо образом со старым, он имеет свой набор данных. Вот в вашем вопросе 3 экземпляра класса CardModel, когда должен быть один. Условно, последний ваш код должен быть таким: var card = new CardModel(); DataContext = card; card.Sh = sh;, как видите, один класс. НО, это нарушение MVVM, ибо View слой не должен знать ничег о про другие слои. – EvgeniyZ Mar 03 '23 at 12:04
  • Как и <Window.DataContext> - это тоже нарушение MVVM. В подходе MVVM окна, это довольно запутанная тема, ибо это View слой, а вы не можете его взять и сделать new Windows().Show(), ибо правила MVVM гласят "Слои не должны знать друг о друге", то есть V не должен знать о VM/M, а VM/M не должны знать о V, ну и M не должен знать о VM/V. А когда вы так инициализируете окно, вы явно, в VM/M слое делаете V. Тут должна быть абстрактная прослойка, некий сервис, который по VM слою откроет вам окно и сам задаст DataContext. – EvgeniyZ Mar 03 '23 at 12:08
  • Во, про окна вспомнил ответ один хороший. Обратите внимание на var askCloseVM = new AskVM("Do you want to close the application?"); - то есть, для окна делается обертка, с ее VM, благодаря которой уже и открывается окно. Нету такого, что в VM слое создается объект V слоя, есть простая работа с ViewModel, не более. Вот это MVVM. – EvgeniyZ Mar 03 '23 at 12:22
  • Ничего не понял, но сделаю. По первому комментарию - да, в обход mvvm, но получилось добиться так, как вы описали. Второй - буду гуглить и седеть, постараюсь придумать как это выстроить. По третьему, спасибо за ссылку, изучу) А вообще большое спасибо за большой комментарий) – Тимур Николаев Mar 03 '23 at 15:15

0 Answers0