如何将 ID 从数据库 object 存储到 WPF 代码中的复选框
How to store ID from database object, to a checkbox in code behind WPF
我正在开发 WPF 应用程序,我有用户,当然用户有某种角色,在我的例子中是 SUPERADMIN 和 ADMIN,这些角色存储在 table "Roles" 中,一个用户可以拥有 1 个或多个角色,这意味着可以在我以这种方式动态生成的表单复选框上选择一个或多个复选框:
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,因为它实际上代表了角色,所以我需要使用相应的角色 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" 的 ID - 角色,我不知道如何在添加标题时将其添加到复选框。
因为大约 1 小时没有人回答这个问题,我认为 post 自己回答是可以的,因为我找到了某种解决方案,我不知道它是否好,但它有效,对于选定的复选框,因为它们是从数据库(角色)中自动生成的,所以可以这样做:
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 对象的属性!
我第一次见到这个人 "Tag" 但它很棒,我希望任何对 "Tag" 有更丰富经验的人向我们解释为什么会这样,为什么会这样使用 .Tag 属性.
很容易访问对象
解决此问题的 "correct" 方法是使用绑定到 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
class(或创建一个新的客户端应用程序特定的 Role
class 有这个 属性 并使用这个而不是你当前的 Role
class).
然后您可以在视图的代码隐藏或视图模型中循环访问所选角色:
foreach (var role in _viewModel.Roles)
{
if(role.IsSelected)
{
//...
}
}
此解决方案基于 MVVM 构建,MVVM 是 推荐的设计模式,可在开发基于 XAML 的用户界面应用程序时使用。你应该学习它。您可以在这里阅读更多相关信息:https://msdn.microsoft.com/en-us/library/hh848246.aspx.
我正在开发 WPF 应用程序,我有用户,当然用户有某种角色,在我的例子中是 SUPERADMIN 和 ADMIN,这些角色存储在 table "Roles" 中,一个用户可以拥有 1 个或多个角色,这意味着可以在我以这种方式动态生成的表单复选框上选择一个或多个复选框:
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,因为它实际上代表了角色,所以我需要使用相应的角色 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" 的 ID - 角色,我不知道如何在添加标题时将其添加到复选框。
因为大约 1 小时没有人回答这个问题,我认为 post 自己回答是可以的,因为我找到了某种解决方案,我不知道它是否好,但它有效,对于选定的复选框,因为它们是从数据库(角色)中自动生成的,所以可以这样做:
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 对象的属性!
我第一次见到这个人 "Tag" 但它很棒,我希望任何对 "Tag" 有更丰富经验的人向我们解释为什么会这样,为什么会这样使用 .Tag 属性.
很容易访问对象解决此问题的 "correct" 方法是使用绑定到 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
class(或创建一个新的客户端应用程序特定的 Role
class 有这个 属性 并使用这个而不是你当前的 Role
class).
然后您可以在视图的代码隐藏或视图模型中循环访问所选角色:
foreach (var role in _viewModel.Roles)
{
if(role.IsSelected)
{
//...
}
}
此解决方案基于 MVVM 构建,MVVM 是 推荐的设计模式,可在开发基于 XAML 的用户界面应用程序时使用。你应该学习它。您可以在这里阅读更多相关信息:https://msdn.microsoft.com/en-us/library/hh848246.aspx.