Я хочу сделать окно, служащее формой ввода, для регистрации новой машины на человека (у человека может быть несколько машин). Когда я открываю это окно из своего главного окна, я хотел бы автоматически заполнить некоторые элементы управления вводом. Одним из них является PersonId, так как это необходимо для создания нового автомобиля. Я сделал пример моего AddCarWindow и его модели представления, опустив большинство свойств, чтобы не усложнять.
Просмотр (xaml):
<Window.DataContext>
<viewModels:AddSalesNotificationViewModel />
</Window.DataContext>
<TextBox
x:Name = "PersonId"
Text = "{Binding PersonId}
IsReadOnly = "True" />
<DatePicker
x:Name = "CarPurchaseDate"
SelectedDate = "{Binding CarPurchaseDate}" />
ВьюМодель (С#):
private int _personId;
public int PersonId
{
get { return _personId; }
set
{
_personId = value;
NotifyPropertyChanged("PersonId");
}
}
private DateTime _carPurchaseDate;
public DateTime CarPurchaseDate
{
get { return _carPurchaseDate; }
set
{
_carPurchaseDate = value;
NotifyPropertyChanged("CarPurchaseDate");
}
}
Поскольку мое главное окно не знает (и не должно) знать о модели представления, я хочу установить PersondId через представление/окно прямо перед его открытием. Так:
AddCarWindow window = new AddCarWindow();
window.PersonId.Text = SelectedPerson.Id.ToString(); // This does NOT work
window.CarPurchaseDate.SelectedDate = DateTime.Now(); // This works
Однако, хотя я могу установить значение текстового поля, оно не привязывается к базовому свойству в модели представления (я предполагаю, потому что я установил его как строку). Однако это работает для CarPurchaseDate.
Как передать значение модели представления, не нарушая принципов MVVM?
Код, который вы поместили здесь для View, соответствует AddCarWindow?
Сначала вам нужно использовать datacontext для привязки вашего представления к модели: window.DataContext = MyViewModel Поскольку ваша модель представления реализует notifypropertychanged, представление автоматически обнаружит изменения и заполнит форму значениями из вашей модели.
Возможно, я немного упростил. Я устанавливаю контекст данных в окне. Добавил в пример...





Я думаю, что вы не устанавливаете datacontext Итак
AddCarWindow window = new AddCarWindow();
window.DataContext = new AddCarViewModel
{
PersonId = SelectedPerson.Id,
CarPurchaseDate = DateTime.Now
};
window.ShowDialog();
Я устанавливаю DataContext в xaml в окне. Может ли это вызвать проблему? Я думал, что это означает, что контекст данных будет существовать в этот момент и что привязки будут работать.
@Noceo, вам нужно установить здесь значение по умолчанию, поэтому я предложил так, и виртуальная машина реализует NotifyPropertyChanged правильно.
Да, я не включил логику для INotifyPropertyChanged, но это часть модели представления. Это также работает, если я устанавливаю контекст данных вручную при создании окна, как вы предлагаете. Я предложил отредактировать ваш пост, что я и использовал.
Здесь вам не хватает логики MVVM. Если вы правильно привязываете свои свойства представления к свойствам модели представления, вам не нужно будет устанавливать данные из представления. Вам просто нужно установить его в модели представления, и данные также будут изменены в представлении благодаря NotifyPropertyChanged.
Вы могли бы на что-то. Я просто подумал, что лучше было бы не позволять моему главному окну видеть модель представления AddCarWindow. Однако, если я создам экземпляр модели представления и заполню свойства (в отличие от того, чтобы позволить окну создать свой собственный экземпляр модели представления), тогда все будет работать.
Абсолютно, View вообще не должен знать о ViewModel. Так что, возможно, я что-то упускаю. У вас есть AddCarWindow, а внутри у вас есть еще один View, может быть, как UserControl? Или вы говорите о представлении AddCarWindow ?
Вы установили
datacontextдля просмотра?