mvvm绑定checkbox wpf_WPF MVVM中的绑定复选框问题

本文讨论了在WPF MVVM架构下,如何正确绑定和处理复选框状态,特别是针对多个复选框与单一布尔值之间的关系。通过示例代码,展示了如何实现复选框状态的双向绑定,并提出使用Flags枚举来优化权限管理的建议。
摘要由CSDN通过智能技术生成

我不知道你的 Set() 方法如何运作;这可能需要你的一点调整 . 那轮到你了 . 我这样写是因为向你解释逻辑比编写代码需要更长的时间 . 您应该阅读此代码并理解它,而不是简单地将其粘贴到您的项目中 .

请注意,我使用传统的C#命名约定编写了这个 . 布尔属性不再具有 b 前缀 . 这意味着您必须从XAML中绑定的路径中删除该前缀 .

另请注意,我将 Rights_All 重命名为 All ,并将其移至另一个viewmodel . 它现在是 Rights viewmodel的成员 . 这也需要更改绑定 .

您应该考虑使用 Flags 枚举作为您的权利 . 这将简化代码,并使将来更容易添加其他权限 .

public class Rights : ViewModelBase

{

private bool _sales;

public bool Sales {

get { return _sales; }

set { SetRightFlag(ref _sales, value); }

}

private bool _product;

public bool Product

{

get { return _product; }

set { SetRightFlag(ref _product, value); }

}

private bool _zone;

public bool Zone

{

get { return _zone; }

set { SetRightFlag(ref _zone, value); }

}

private bool _percentage;

public bool Percentage

{

get { return _percentage; }

set { SetRightFlag(ref _percentage, value); }

}

private bool _user;

public bool User

{

get { return _user; }

set { SetRightFlag(ref _user, value); }

}

// This logic needs to happen in five different setters, so I put it in a

// method.

private bool SetRightFlag(ref bool field, bool value, [System.Runtime.CompilerServices.CallerMemberName] string propName = null)

{

if (field != value)

{

Set(ref field, value, propName);

UpdateAll();

return true;

}

return false;

}

// I made this its own method as well, for cleanliness and clarity, even though

// it's only called once.

protected void UpdateAll()

{

// Don't call the All setter from here, because it has side effects.

if (User && Percentage && Zone && Product && Sales)

{

_all = true;

OnPropertyChanged(nameof(All));

}

else if (!User && !Percentage && !Zone && !Product && !Sales)

{

_all = false;

OnPropertyChanged(nameof(All));

}

else if (All.HasValue)

{

_all = null;

OnPropertyChanged(nameof(All));

}

}

private bool? _all = null;

public bool? All

{

get { return _all; }

set {

if (_all != value)

{

Set(ref _all, value);

if (_all.HasValue)

{

User = Percentage = Zone = Product = Sales = (bool)_all;

}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值