Как связать структуру с элементом управления текстовыми полями в WPF MVVM

53
5

Я хотел связать три текстовых поля с тремя членами структуры. Вот мой код XAML:

<TextBox Grid.Column="1" Height="32" HorizontalAlignment="Left" Margin="322,12,0,0" Text="{Binding SelectedStudentDetails.FirstName, Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="199" />
<TextBox Grid.Column="1" Height="30" HorizontalAlignment="Left" Margin="322,75,0,0" Text="{Binding SelectedStudentDetails.LastName,Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="199" />
<TextBox Grid.Column="1" Height="33" HorizontalAlignment="Left" Margin="322,137,0,0" Text="{Binding SelectedStudentDetails.City,Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="199" />

Вот фрагмент viewModel:

private Student _selectedstudentDetails;
public Student SelectedStudentDetails
{
get {
return _selectedstudentDetails;
}
set
{
if (_selectedstudentDetails != value)
{
_selectedstudentDetails = value;
RaisePropertyChanged("SelectedStudentDetails");

}
}
}

//StudentList is the observable list type

public void AddStudentDetails(object param)
{
StudentList.Add(new Student { FirstName = SelectedStudentDetails.FirstName, LastName = SelectedStudentDetails.LastName, City = SelectedStudentDetails.City });
}

Как заполнить объект "Студент", используя структуру привязки с элементами управления текстовыми полями?

Объявление студенческого класса:

namespace SimplestMVVM.Model
{
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
}
}

спросил(а) 2014-09-09T15:07:00+04:00 5 лет, 8 месяцев назад
1
Решение
53

Ну, ваш вопрос не совсем ясен, но я думаю, ваша проблема в том, что SelectedStudentDetails.FirstName, SelectedStudentDetails.LastName и SelectedStudentDetails.City всегда имеют нулевое значение?

В основном это связано с тем, что ваш объект Student должен иметь viewModel (или, по крайней мере, INotifyPropertyChanged). Потому что он должен уведомлять, когда вы обновляете свои свойства из своего представления. (И да, это должно быть свойство). В противном случае он никогда не будет уведомлять, что вы меняете значения, и они остаются пустыми.

Самый простой способ в моем определении был бы создать CLASS StudentViewModel с вашими требуемыми свойствами. Таким образом ваша привязка будет работать.

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

Бесплатный совет, как я здесь, было бы намного лучше в вашем XAML, если вы злоупотребляете маржей. Ты мог бы сделать что-то вроде этого:

   <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Height="30" HorizontalAlignment="Left" Text="{Binding SelectedStudentDetails.FirstName, Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="199" />
<TextBox Grid.Column="1" Height="30" HorizontalAlignment="Left" Text="{Binding SelectedStudentDetails.LastName,Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="199" />
<TextBox Grid.Column="2" Height="30" HorizontalAlignment="Left" Text="{Binding SelectedStudentDetails.City, Mode=TwoWay}" TextWrapping="Wrap" VerticalAlignment="Top" Width="199" />
</Grid>

ответил(а) 2014-09-09T18:54:00+04:00 5 лет, 8 месяцев назад
38

Внедрить INotifyPropertyChanged для вашего студенческого класса

ответил(а) 2014-09-10T12:15:00+04:00 5 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема