Имеется класс 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
<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:08var askCloseVM = new AskVM("Do you want to close the application?");- то есть, для окна делается обертка, с ее VM, благодаря которой уже и открывается окно. Нету такого, что в VM слое создается объект V слоя, есть простая работа с ViewModel, не более. Вот это MVVM. – EvgeniyZ Mar 03 '23 at 12:22