c# - 使用 MVVM Light 时处理复选框的最佳方法是什么
问题描述
我有几个复选框,UI 会根据它们的状态而改变。在代码中,我每次单击复选框时都会发送一条消息,一切正常,但我不确定这是否是处理复选框的最有效方法。抱歉,我是整个 WPF/MVVM 的新手。
这就是我的做法......
XAML:
<Grid x:Name="LayoutRoot">
<CheckBox x:Name="checkBox" Command="{Binding CheckBoxCommand}" Content="My Check Box"/>
</Grid>
视图模型:
namespace MvvmLightCheckBoxes.ViewModel
{
public class MainViewModel : ViewModelBase
{
public RelayCommand CheckBoxCommand { get; set; }
private Boolean _isCheckBoxChecked = true;
public MainViewModel(IDataService dataService)
{
CheckBoxCommand = new RelayCommand(() => checkBoxClick());
}
private void checkBoxClick()
{
if (_isCheckBoxChecked) {
Messenger.Default.Send(new MessageFromMain { isBoxChecked = _isCheckBoxChecked });
_isCheckBoxChecked = false;
}else {
Messenger.Default.Send(new MessageFromMain { isBoxChecked = _isCheckBoxChecked });
_isCheckBoxChecked = true;
}
}
}
}
代码隐藏:
namespace MvvmLightCheckBoxes
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Messenger.Default.Register<MessageFromMain>(this, m => ReceivedMessageFromMain(m));
}
private void ReceivedMessageFromMain(MessageFromMain m)
{
if (m.isBoxChecked) {
Console.WriteLine("Box is checked");
}
else {
Console.WriteLine("Box is unchecked");
}
}
}
}
模型:
namespace MvvmLightCheckBoxes.Model
{
class MessageFromMain
{
public Boolean isBoxChecked { set; get; }
}
}
这是在使用 MVVM 时处理复选框的可接受方式吗?
解决方案
不,通常你绑定IsChecked
属性:
<CheckBox IsChecked="{Binding CheckStatus}" Content="Click Me"/>
然后在您的视图模型中执行以下操作:
private bool _CheckStatus;
public bool CheckStatus
{
get { return this._CheckStatus; }
set
{
if (this._CheckStatus != value)
{
this._CheckStatus = value;
RaisePropertyChanged(() => this.CheckStatus);
}
}
}
通常拥有一个带有 get/set 访问器的常规属性就足够了,如果您希望绑定是双向的,您只需要添加属性更改通知,即您还可以在视图模型代码中切换状态。
还将该代码从 MainWindow 中取出。如果您发现自己在 Window 类中添加代码,那么这意味着您可能做错了什么。
推荐阅读
- php - Symfony 3.4 全局变量
- ruby-on-rails - 使用 wkhtmltopdf-binary 剪切文本
- apache-spark - Spark 数据集 - 引用类型为带有 callUDF 的数组的列
- c# - C#杀死不存在的进程
- webpack - 在 webpack 4 中,如何只在一个条目上拆分块?
- json - juju 状态和 jq 从 JSON 状态的多个对象中过滤混合内容
- c# - 如何获取字符串中的向量位置并将其存储为整数?
- firebase - Firebase Send Rest API 导致 MismatchSenderId 错误
- cluster-computing - 使用 Terraform 进行垂直缩放
- scala - “for”在 Scala 中是如何工作的?