Программно заполнить текстовое поле привязкой

Я хочу сделать окно, служащее формой ввода, для регистрации новой машины на человека (у человека может быть несколько машин). Когда я открываю это окно из своего главного окна, я хотел бы автоматически заполнить некоторые элементы управления вводом. Одним из них является 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?

Вы установили datacontext для просмотра?

Avinash Reddy 11.04.2019 11:07

Код, который вы поместили здесь для View, соответствует AddCarWindow?

Quentin S. 11.04.2019 11:09

Сначала вам нужно использовать datacontext для привязки вашего представления к модели: window.DataContext = MyViewModel Поскольку ваша модель представления реализует notifypropertychanged, представление автоматически обнаружит изменения и заполнит форму значениями из вашей модели.

Sebastian Siemens 11.04.2019 11:10

Возможно, я немного упростил. Я устанавливаю контекст данных в окне. Добавил в пример...

Jakob Busk Sørensen 11.04.2019 11:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, что вы не устанавливаете datacontext Итак

AddCarWindow window = new AddCarWindow();
window.DataContext = new AddCarViewModel 
{
   PersonId = SelectedPerson.Id,
   CarPurchaseDate = DateTime.Now
};
window.ShowDialog();

Я устанавливаю DataContext в xaml в окне. Может ли это вызвать проблему? Я думал, что это означает, что контекст данных будет существовать в этот момент и что привязки будут работать.

Jakob Busk Sørensen 11.04.2019 11:15

@Noceo, вам нужно установить здесь значение по умолчанию, поэтому я предложил так, и виртуальная машина реализует NotifyPropertyChanged правильно.

Avinash Reddy 11.04.2019 11:19

Да, я не включил логику для INotifyPropertyChanged, но это часть модели представления. Это также работает, если я устанавливаю контекст данных вручную при создании окна, как вы предлагаете. Я предложил отредактировать ваш пост, что я и использовал.

Jakob Busk Sørensen 11.04.2019 11:22

Здесь вам не хватает логики MVVM. Если вы правильно привязываете свои свойства представления к свойствам модели представления, вам не нужно будет устанавливать данные из представления. Вам просто нужно установить его в модели представления, и данные также будут изменены в представлении благодаря NotifyPropertyChanged.

Вы могли бы на что-то. Я просто подумал, что лучше было бы не позволять моему главному окну видеть модель представления AddCarWindow. Однако, если я создам экземпляр модели представления и заполню свойства (в отличие от того, чтобы позволить окну создать свой собственный экземпляр модели представления), тогда все будет работать.

Jakob Busk Sørensen 11.04.2019 11:21

Абсолютно, View вообще не должен знать о ViewModel. Так что, возможно, я что-то упускаю. У вас есть AddCarWindow, а внутри у вас есть еще один View, может быть, как UserControl? Или вы говорите о представлении AddCarWindow ?

Quentin S. 11.04.2019 11:24

Другие вопросы по теме