在 WPF 中设置为复选框的绑定

发布于 2024-11-09 11:04:33 字数 215 浏览 0 评论 0原文

使用实体框架(C#)我有一个 User 类,它具有 ONE:MANY 映射到 UserRight 类(简单地说,用户有一组权)。每个权限都由一个字符串标识。现在,由于可能的最大权限数量是有限的 (<10),我希望有 10 个复选框并手动编辑给定用户的权限子集。

有什么好的方法可以做到这一点?

詹姆斯

using Entity Framework (C#) I have a User class which has ONE:MANY mapping to the UserRight class (simply, user has a set of rights). Each right is identified by a string. And now, because the maximum number of possible rights is finite (<10) I'd like to have 10 CheckBoxes and edit the subset of rights for a given user manually.

What is the nice way to do it?

James

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

酷到爆炸 2024-11-16 11:04:33

创建一个 RightViewModel 类来包含用户权限:

public class RightViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            Change("Name");
        }
    }

    private bool _hasRight;
    public bool HasRight
    {
        get { return _hasRight; }
        set
        {
            _hasRight = value;
            Change("HasRight");
        }
    }

    public void Change(string strPropertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(strPropertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

为您的用户创建一个类似的类,其中包含 ObservableCollection 类型的成员 Rights

在 XAML 中,使用 ItemsControl

<ItemsControl ItemsSource="{Binding Rights}"
    ItemTemplate="{StaticResource RightTemplate}"/>

和模板定义:

<DataTemplate x:Key="RightTemplate">
    <CheckBox Content="{Binding Name}" IsChecked="{Binding HasRight, Mode=TwoWay}"/>
</DataTemplate>

Mode=TwoWay 使绑定更新您的 RightViewModel 实例。

如果您需要使用不同的布局显示复选框,请定义 ItemsControlItemsPanel

最后将您的用户设置为容器的DataContext

Create a RightViewModel class to contain user rights:

public class RightViewModel : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            Change("Name");
        }
    }

    private bool _hasRight;
    public bool HasRight
    {
        get { return _hasRight; }
        set
        {
            _hasRight = value;
            Change("HasRight");
        }
    }

    public void Change(string strPropertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(strPropertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

Create a similar class for your user, containing a member Rightsof type ObservableCollection<RightViewModel>.

In you XAML, use an ItemsControl:

<ItemsControl ItemsSource="{Binding Rights}"
    ItemTemplate="{StaticResource RightTemplate}"/>

And a template definition:

<DataTemplate x:Key="RightTemplate">
    <CheckBox Content="{Binding Name}" IsChecked="{Binding HasRight, Mode=TwoWay}"/>
</DataTemplate>

Mode=TwoWay makes the binding update your RightViewModel instance.

Define the ItemsControl's ItemsPanel if you need to display your checkboxes with a different layout.

Finally set your user as the DataContext of your container.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文