WPF MVVM Загрузить объект в текстовое поле из таблицы данных, используя привязку и - PullRequest
0 голосов
/ 09 января 2020

У меня странная проблема. Мне не очень удобно. NET WPF.

У меня есть Datagrid, где есть список сотрудников, и мне нужно загрузить в текстовое поле фамилию и имя выбранного сотрудника. У меня есть архитектура MVVM.

Список моих сотрудников загружается очень хорошо, но когда я хочу нажать на сотрудника, ничего не происходит. Мое текстовое поле должно быть заполнено фамилией и именем. Я что-то пропустил?

Вот мой код.

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}"/>

Класс Employee в моей ViewModel

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;
}

класс employeeDto

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; }
}

}

1 Ответ

0 голосов
/ 09 января 2020

Возможно, вы хотели использовать SelectedEmployee в привязках TextBox, например

<TextBox Text="{Binding SelectedEmployee.LastName, UpdateSourceTrigger=PropertyChanged}" ... />
<TextBox Text="{Binding SelectedEmployee.FirstName, UpdateSourceTrigger=PropertyChanged}" ... />

или

<StackPanel DataContext="{Binding SelectedEmployee}">
    <TextBox Text="{Binding LastName, UpdateSourceTrigger=PropertyChanged}" ... />
    <TextBox Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}" ... />
</StackPanel>

Затем необходимо также запустить событие PropertyChanged для SelectedEmployee свойство:

public EmployeeDTO SelectedEmployee
{
    get { return selectedEmployee; }
    set
    {
        selectedEmployee = value;
        OnPropertyChanged(nameof(SelectedEmployee));
    }
}

И вы должны реализовать три связанных свойства 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));
    }
}
...