[英]WPF MVVM Load object in textbox from datagrid using binding and
I'm in a strange issue.I'm not very comfortable with .NET WPF.我遇到了一个奇怪的问题。我对 .NET WPF 不太满意。
I have a Datagrid where have a list of Employees and I need to load in a textBox the Lastname and firstname of the selectedEmployee.我有一个 Datagrid,其中有一个员工列表,我需要在 textBox 中加载所选员工的姓氏和名字。 I have a MVVM architecture.
我有一个 MVVM 架构。
The list of my employees loads very well but when I want to click on an employee, nothing happens.我的员工列表加载得很好,但是当我想点击一个员工时,什么也没有发生。 My textbox should be filled with the Lastname and Firstname.
我的文本框应该填充姓氏和名字。 Did I missed something ?
我错过了什么吗?
Here is my code.这是我的代码。
Datagrid数据网格
<DataGrid Name="dgCustomers" SelectedItem="{Binding SelectedEmployee}" Margin="6" Grid.Row="1" AutoGenerateColumns="False" ItemsSource="{Binding EmployeesList}" IsReadOnly="True">
<DataGrid.Columns>
<!--<DataGridTextColumn Binding="{Binding LastName}" Header="Name" Width="*" />-->
<DataGridTextColumn Binding="{Binding FullName}" Header="First Name" Width="*" />
<DataGridTextColumn Binding="{Binding DisplayBirthDate}" Header="Birth Date" Width="*" />
</DataGrid.Columns>
</DataGrid>
TextBox文本框
<TextBox Height="27" Margin="6,6,6,5" Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" />
<TextBox Height="27" Margin="6,6,6,5" Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}"/>
Class Employee in my ViewModel我的 ViewModel 中的 Employee 类
class EmployeeVM : INotifyPropertyChanged
{
private NorthwindEntities2 context = new NorthwindEntities2(); //db
private ObservableCollection<EmployeeDTO> employeesList;
private DelegateCommand addCommand;
private EmployeeDTO selectedEmployee;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public ObservableCollection<EmployeeDTO> EmployeesList
{
get
{
if (employeesList == null)
{
employeesList = LoadEmployees();
}
return employeesList;
}
}
/* public DelegateCommand SaveCommand
{
get
{
if (addCommand != null)
return addCommand;
return new DelegateCommand(null); //a completer
}
}*/
public EmployeeDTO SelectedEmployee
{
get { return selectedEmployee; }
set { selectedEmployee = value; }
}
private ObservableCollection<EmployeeDTO> LoadEmployees()
{
ObservableCollection<EmployeeDTO> toReturn = new ObservableCollection<EmployeeDTO>();
foreach (var item in context.Employees)
{
toReturn.Add(new EmployeeDTO(item));
}
return toReturn;
}
class employeeDto班级雇员Dto
class EmployeeDTO : INotifyPropertyChanged
{
private string fullname;
private string lastname;
private string firstname;
private string title;
private DateTime? birthDate;
private DateTime? hireDate;
private string displayBirthDate;
public EmployeeDTO(Employee employee)
{
lastname = employee.LastName;
firstname = employee.FirstName;
title = employee.Title;
birthDate = employee.BirthDate;
hireDate = employee.HireDate;
fullname = firstname + " " + lastname;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public string DisplayBirthDate
{
get { return displayBirthDate = birthDate.ToString(); }
}
public string FullName
{
get { return fullname; }
set { fullname = value; }
}
public string LastName
{
get { return lastname; }
set { lastname = value; OnPropertyChanged("FullName"); }
}
public string FirstName
{
get { return firstname; }
set { firstname = value; OnPropertyChanged("FullName"); }
}
public DateTime? BirthDate
{
get { return birthDate; }
set { birthDate = value; OnPropertyChanged("DisplayBirthDate"); }
}
public DateTime? HireDate
{
get { return hireDate; }
set { HireDate = value; }
}
} }
You probably wanted to use the SelectedEmployee
in the TextBox Bindings, like您可能想在 TextBox 绑定中使用
SelectedEmployee
,例如
<TextBox Text="{Binding SelectedEmployee.LastName, UpdateSourceTrigger=PropertyChanged}" ... />
<TextBox Text="{Binding SelectedEmployee.FirstName, UpdateSourceTrigger=PropertyChanged}" ... />
or或者
<StackPanel DataContext="{Binding SelectedEmployee}">
<TextBox Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" ... />
<TextBox Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}" ... />
</StackPanel>
You must then also fire the PropertyChanged event for the SelectedEmployee
property:然后,您还必须为
SelectedEmployee
属性触发 PropertyChanged 事件:
public EmployeeDTO SelectedEmployee
{
get { return selectedEmployee; }
set
{
selectedEmployee = value;
OnPropertyChanged(nameof(SelectedEmployee));
}
}
And you should implement the three related EmployeeDTO properties like this:您应该像这样实现三个相关的 EmployeeDTO 属性:
public string FullName
{
get { return firstname + " " + lastname; }
}
public string LastName
{
get { return lastname; }
set
{
lastname = value;
OnPropertyChanged(nameof(LastName));
OnPropertyChanged(nameof(FullName));
}
}
public string FirstName
{
get { return firstname; }
set
{
firstname = value;
OnPropertyChanged(nameof(FirstName));
OnPropertyChanged(nameof(FullName));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.