简体   繁体   English

WPF MVVM 使用绑定和从数据网格加载文本框中的对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM