Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何标记用户';已更改DataGrid选择上由动态创建的复选框表示的角色_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# 如何标记用户';已更改DataGrid选择上由动态创建的复选框表示的角色

C# 如何标记用户';已更改DataGrid选择上由动态创建的复选框表示的角色,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我正在开发WPF应用程序,我有用户,当然用户有一些角色,在我的例子中是SUPERADMIN和ADMIN,角色存储在表“roles”中,一个用户可以有一个或多个角色,这意味着可以在我的表单上选择一个或多个复选框。我以友好方式生成了复选框: 我正在将复选框添加到堆栈面板中,该面板的方向是垂直的,因此在应用下面的方法后,它看起来是这样的: 现在我想知道,当我选择另一个用户时,如何为每个用户显示/标记/选中或任何适当的复选框(用户包含在DataGrid dtgUsers中,因此当我在用户之间更改选择时

我正在开发WPF应用程序,我有用户,当然用户有一些角色,在我的例子中是SUPERADMIN和ADMIN,角色存储在表“roles”中,一个用户可以有一个或多个角色,这意味着可以在我的表单上选择一个或多个复选框。我以友好方式生成了复选框:

我正在将复选框添加到堆栈面板中,该面板的方向是垂直的,因此在应用下面的方法后,它看起来是这样的:

现在我想知道,当我选择另一个用户时,如何为每个用户显示/标记/选中或任何适当的复选框(用户包含在DataGrid dtgUsers中,因此当我在用户之间更改选择时,我将触发dtgUsers\u SelectionChanged事件,并且在执行此操作时,我还需要显示相应的复选框作为角色的表示,当然,它们必须作为所选用户具有(所选)角色的表示进行选中)

现在我是这样做的,我认为这是一种非常糟糕的方法,因此我要求提供新的或更好的解决方案。

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>