Почему 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);
}
}
Почему 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.







