Почему selectedUsers не присваивается значения из dataGrid

    public partial class Users
    {
        public int User_Id { get; set; }
        public string User_Email { get; set; }
        public string User_Password { get; set; }
        public string User_Role { get; set; }
    }

 partial class Users
    {
        public override string ToString()
        {
            return User_Id + "" + User_Email + "" + User_Password + "" + User_Role;
        }
    }

 <DataGrid x:Name="UsersDataGrid" HorizontalAlignment="Center" Height="125" VerticalAlignment="Top" Width="330" IsSynchronizedWithCurrentItem="False" Initialized="UsersDataGrid_Initialized" AreRowDetailsFrozen="True" SelectionChanged="UsersDataGrid_SelectionChanged" MouseUp="UsersDataGrid_MouseUp">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Id}" ClipboardContentBinding="{x:Null}" Header="Код" Width="31"/>
                <DataGridTextColumn Binding="{Binding Email}" ClipboardContentBinding="{x:Null}" Header="Логин" Width="120"/>
                <DataGridTextColumn Binding="{Binding Password}" ClipboardContentBinding="{x:Null}" Header="Пароль" Width="80"/>
                <DataGridTextColumn Binding="{Binding Role}" ClipboardContentBinding="{x:Null}" Header="Роль" Width="91"/>
            </DataGrid.Columns>
        </DataGrid>

 private void UsersDataGrid_MouseUp(object sender, MouseButtonEventArgs e)
        {
            
            var selectedUsers = UsersDataGrid.SelectedItems[0] as Users;

            if (selectedUsers != null)
            {
                TextBoxLoginOptions.Text = selectedUsers.User_Email;
                TextBoxPasswordOptions.Text = selectedUsers.User_Password;
                TextBoxRoleOptions.Text = selectedUsers.User_Role;
            }
            else
            {
                TextBoxLoginOptions.Text = "";
                TextBoxPasswordOptions.Text = "";
                TextBoxRoleOptions.Text = "";
            }
        }

  private void UsersDataGrid_Initialized(object sender, EventArgs e)
        {
            var query = from user in entities.Users
                        select new
                        {
                            Id = user.User_Id,
                            Email = user.User_Email,
                            Password = user.User_Password,
                            Role = user.User_Role
                        };
            foreach (var user in query)
            {
                UsersDataGrid.Items.Add(user);
            }
        }

введите сюда описание изображения Пробовал через Item

введите сюда описание изображения

Пробовал через Items

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

Почему selectedUsers не присваивается значения из dataGrid

Класс Users это таблица из бд Модель ADO.NET EDM


Ответы (1 шт):

Автор решения: aepot

Данные нужно деананимизировать, иначе придется втыкать некрасивые костыли.

Создайте вьюмодель класса пользователя

public class UserViewModel
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string Role { get; set; }
}

далее вот так

private void UsersDataGrid_Initialized(object sender, EventArgs e)
{
    var query = from user in entities.Users select new UserViewModel
    {
        Id = user.User_Id,
        Email = user.User_Email,
        Password = user.User_Password,
        Role = user.User_Role
    };
    UsersDataGrid.ItemsSource = query.ToArray();
}

и вот так

private void UsersDataGrid_MouseUp(object sender, MouseButtonEventArgs e)
{
    var selectedUser = UsersDataGrid.SelectedItem as UserViewModel;

    TextBoxLoginOptions.Text = selectedUser?.Email ?? string.Empty;
    TextBoxPasswordOptions.Text = selectedUser?.Password ?? string.Empty;
    TextBoxRoleOptions.Text = selectedUser?.Role ?? string.Empty;
}

Но есть способ проще.

В конструкторе окна сделайте так

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}

И заведите свойство

private UserViewModel selectedUser;
public UserViewModel SelectedUser
{
    get => selectedUser;
    set
    {
        selectedUser = value;
        TextBoxLoginOptions.Text = selectedUser?.Email ?? string.Empty;
        TextBoxPasswordOptions.Text = selectedUser?.Password ?? string.Empty;
        TextBoxRoleOptions.Text = selectedUser?.Role ?? string.Empty;
    }
}

В XAML разметке

<DataGrid x:Name="UsersDataGrid" SelectedItem="{Binding SelectedUser}" ...>

А обработчик UsersDataGrid_MouseUp теперь нужно просто удалить.

Поздравляю, вы сделали свою первую одностороннюю привязку данных "контрол->модель". Изучите привязки данных, они достаточно мощный инструмент, кода придется писать намного меньше. Ну и почитайте про шаблон проектирования MVVM.

→ Ссылка