2017-04-06 20 views
0

我工作的WPF应用程序,我有用户,ofcourse用户具有某种角色,在我的情况下,超级管理员和管理员,该角色存储在表中“角色”,一个用户可以有1个或多个角色,这样就意味着一个或多个复选框可以对我动态生成的在这条路上我的表单复选框被选中:如何在代码存储ID从数据库对象,以一个复选框后面WPF

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); 
    } 
} 

后来,当我保存用户我需要的,因为它代表着acctually角色从检查组合框获得ID,所以我需要插入到具有相应角色ID数据库..

这里是我拿了选择事件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(); 

但我需要的“R”标识 - 角色也和我不t知道如何将它添加到复选框的方式我添加标题。

回答

1

解决这个的“正确”的方法是使用您绑定到IEnumerable<Role>ItemsControl

<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类)。

然后,您可以通过所选择的角色重复,无论是在视图的代码隐藏或视图模型:

foreach (var role in _viewModel.Roles) 
{ 
    if(role.IsSelected) 
    { 
     //... 
    } 
} 

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

+0

@My的朋友,我会尽量很快将此解决方案:) THX你的答案。 –

0

因为没有人对这个问题回答像1个小时,我觉得这是确定由我自己,因为我已经找到了某种形式的解决方案张贴的答案,我不知道是好,但它的工作原理,以及对选中盒,因为它们是从acctually数据库(角色)产生的,可以做这样的事情:

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财产和分配真正的对象从数据库到标签,所以我以后可以轻松获得该数据库对象的属性来自我选中的复选框!

我第一次看到这个家伙“标签”,但它很棒,我希望有更大的经验与“标签”的任何人向我们解释为什么这样的作品是这样的,以及如何很容易地访问对象与。标签propery。

相关问题