如何将ID从数据库对象存储到WPF后面的代码中的复选框

时间:2017-04-06 18:55:36

标签: c# wpf bind

我正在开发WPF应用程序,我有用户,当然用户有某种角色,在我的案例SUPERADMIN和ADMIN中,角色存储在表格中#34;角色",一个用户可以拥有一个或多个角色,这意味着可以在我以这种方式动态生成的表单复选框上选中一个或多个复选框:

private void LoadRolesToStackPanel()
{
    try
    {
        var roles = RolesController.Instance.SelectAll();

        if (roles.Count > 0)
        {
            foreach (Role r in roles)
            {
                CheckBox cb = new CheckBox();

                //cb.Name = r.RoleId.ToString();

                cb.Content = r.Title.ToString();
                cb.FontSize = 15;
                stackRole.Children.Add(cb);
            }
        }


    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

稍后当我保存用户时,我需要从已检查的组合框中获取ID,因为它实际上代表了角色,所以我需要使用相应的RoleId插入数据库..

以下是我在事件SaveUser上选择复选框的方法:

IEnumerable<CheckBox> selectedBoxes =
        from checkbox in this.stackRole.Children.OfType<CheckBox>()
        where checkbox.IsChecked.Value
        select checkbox;

foreach (CheckBox box in selectedBoxes)
{
// do something 
}

因为我可以注意到我可以从组合框获得标题因为我说

cb.Content = r.Title.ToString();

但我需要ID&#34; r&#34; - 角色也是,我不知道如何在添加标题的方式将其添加到复选框。

2 个答案:

答案 0 :(得分:1)

解决此问题的“正确”方法是使用绑定到ItemsControl的{​​{1}}:

IEnumerable<Role>
<ItemsControl ItemsSource="{Binding Roles}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Title}" FontSize="15" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这意味着您应该向public partial class MainWindow : Window { private readonly ViewModel _viewModel = new ViewModel(); public MainWindow() { InitializeComponent(); DataContext = _viewModel; } } public class ViewModel { public ViewModel() { Roles = RolesController.Instance.SelectAll(); } public List<Role> Roles { get; private set; } } 类添加IsChecked属性(或创建具有此属性的新客户端应用程序特定Role类,并使用此属性而不是当前属性Role类)。

然后,您可以在视图的代码隐藏或视图模型中迭代选定的角色:

Role

此解决方案基于MVVM构建,MVVM是在开发基于XAML的用户界面应用程序时使用的 推荐设计模式。你应该学习它。你可以在这里阅读更多相关信息:https://msdn.microsoft.com/en-us/library/hh848246.aspx

答案 1 :(得分:0)

因为没有人在这个问题上回答过1个小时,我认为自己发布答案是可以的,因为我找到了某种解决方案,我不知道它是不是很好但是它适用于选定的复选框,因为它们是从数据库(角色)实际生成的,它可以做这样的事情:

private void LoadRolesToStackPanel()
{
    try
    {
        var roles = RolesController.Instance.SelectAll();
        if (roles.Count > 0)
        {
            foreach (Role r in roles)
            {
                CheckBox cb = new CheckBox();

                cb.Tag = r;

                cb.Content = r.Title.ToString();
                cb.FontSize = 15;
                stackRole.Children.Add(cb);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

foreach (CheckBox box in selectedBoxes)
{
    Role r = (Role)box.Tag;
    //Here we get Id and every other Property that Role had
    var x = r.Id;
}

所以我包含.Tag属性并将DB中的实际对象分配给该标记,以便稍后我可以从我选中的复选框中轻松访问该DB对象的属性!

我第一次看到这个家伙&#34; Tag&#34;但它很棒,而且我会满足于那些拥有更多经验的人#34; Tag&#34;向我们解释为什么这样做是这样的,以及如何通过.Tag propery访问对象如此容易。