c# - 使用 MVVM Light 时处理复选框的最佳方法是什么

标签 c# wpf mvvm 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 时处理复选框的可接受方式吗?

最佳答案

不,通常你绑定(bind) IsChecked属性(property):

<CheckBox IsChecked="{Binding CheckStatus}" Content="Click Me"/>

然后在您的 View 模型中执行以下操作:
private bool _CheckStatus;
public bool CheckStatus
{
    get { return this._CheckStatus; }
    set
    {
        if (this._CheckStatus != value)
        {
            this._CheckStatus = value;
            RaisePropertyChanged(() => this.CheckStatus);
        }
    }
}

通常拥有一个带有 get/set 访问器的常规属性就足够了,如果你希望绑定(bind)是双向的,你只需要添加属性更改通知,即你也可以在 View 模型代码中切换状态。

还将该代码从 MainWindow 中取出。如果您发现自己在 Window 类中添加代码,那么这意味着您可能做错了什么。

关于c# - 使用 MVVM Light 时处理复选框的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51509796/

相关文章:

c# - 此 View 列表不允许编辑项目

wpf - ObservableCollection 和 INotifyPropertyChanged 有什么区别?

c# - 如何在C Sharp中使用DLL

c# - 为什么 'double-checked-locking' 的表达式总是正确的?

c# - 需要帮助创建复杂的 ef linq select

c# - 在 ALT+TAB 中显示任务,但不在任务栏中显示

c# - 在 Compact Framework 中隐藏标题栏

c# - 如何在 WPF 应用程序中显示错误消息?

wpf - 如何保持用户控制?

c# - INotifyPropertyChanged 的​​ OnPropertyChanged 参数