C# 如何标记用户';已更改DataGrid选择上由动态创建的复选框表示的角色
我正在开发WPF应用程序,我有用户,当然用户有一些角色,在我的例子中是SUPERADMIN和ADMIN,角色存储在表“roles”中,一个用户可以有一个或多个角色,这意味着可以在我的表单上选择一个或多个复选框。我以友好方式生成了复选框: 我正在将复选框添加到堆栈面板中,该面板的方向是垂直的,因此在应用下面的方法后,它看起来是这样的: 现在我想知道,当我选择另一个用户时,如何为每个用户显示/标记/选中或任何适当的复选框(用户包含在DataGrid dtgUsers中,因此当我在用户之间更改选择时,我将触发dtgUsers\u SelectionChanged事件,并且在执行此操作时,我还需要显示相应的复选框作为角色的表示,当然,它们必须作为所选用户具有(所选)角色的表示进行选中) 现在我是这样做的,我认为这是一种非常糟糕的方法,因此我要求提供新的或更好的解决方案。C# 如何标记用户';已更改DataGrid选择上由动态创建的复选框表示的角色,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我正在开发WPF应用程序,我有用户,当然用户有一些角色,在我的例子中是SUPERADMIN和ADMIN,角色存储在表“roles”中,一个用户可以有一个或多个角色,这意味着可以在我的表单上选择一个或多个复选框。我以友好方式生成了复选框: 我正在将复选框添加到堆栈面板中,该面板的方向是垂直的,因此在应用下面的方法后,它看起来是这样的: 现在我想知道,当我选择另一个用户时,如何为每个用户显示/标记/选中或任何适当的复选框(用户包含在DataGrid dtgUsers中,因此当我在用户之间更改选择时
private void dtgUsers_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (dtgUsers.SelectedItem != null)
{
stackRole.Children.Clear();
User user = (User)(dtgUsers.SelectedItem);
if (user != null)
{
//Get all roles from database for selected user
user.Roles = RolesController.SelectByUserId(user.Id);
if (user.Roles.Count > 0)
{
//This is bad approach I took Title of each user's role to compare it with all existing roles
var roleNames = user.Roles.Select(r => r.Title);
var allRoles = RolesController.SelectAll();
if (allRoles.Count > 0)
{
foreach (Role r in allRoles)
{
CheckBox cb = new CheckBox();
cb.Content = r.Title.ToString();
cb.FontSize = 15;
cb.Tag = r;
stackRole.Children.Add(cb);
if (roleNames.Contains(cb.Content)) //Here I'm bassically as I am creating checkbox immediatelly checking/marking it if it exist in user's roles
cb.IsChecked = true;
}
}
}
}
}
任何关于我应该如何解决这个问题/使之更好的建议都是非常受欢迎的!
谢谢各位
干杯正如我在前面的回答中告诉您的那样,如果您想使用最佳实践来实现这一点,您应该查看MVVM设计模式: 然后,您可以简单地绑定
ItemsControl
,其中角色将显示给DataGrid
中当前选定的用户:
<ItemsControl ItemsSource="{Binding SelectedItem.Roles, ElementName=dtgUsers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Title}" FontSize="15" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
当您在
DataGrid
中选择一个项目时,角色列表将自动更新,我将很快尝试实现它,但是通过查看您的代码,我无法识别如何循环选择角色?我在前面的回答中看到了这段代码:foreach(在_viewModel.roles中的var role){if(role.IsSelected){//…}}这意味着循环遍历所有角色,但仅在选择角色时执行操作?是的,完全正确。如果已将IsChecked属性绑定到IsSelected属性,则选中复选框时角色的IsSelected属性将设置为true。
<ItemsControl ItemsSource="{Binding SelectedItem.Roles, ElementName=dtgUsers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Title}" FontSize="15" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>