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

C# 使用MVVM Light时,处理复选框的最佳方法是什么,c#,wpf,mvvm,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

我有几个复选框,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; }
    }
}
Codebihind:

<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"/>
通常,具有带有get/set访问器的常规属性就足够了,如果希望绑定是双向的,那么只需添加属性更改通知,这样您还可以在视图模型代码中切换状态


同时将该代码从主窗口中取出。如果您发现自己在窗口类中添加了代码,则意味着您可能做错了什么。

否,通常您会绑定
IsChecked
属性:

<CheckBox IsChecked="{Binding CheckStatus}" Content="Click Me"/>
通常,具有带有get/set访问器的常规属性就足够了,如果希望绑定是双向的,那么只需添加属性更改通知,这样您还可以在视图模型代码中切换状态


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

我明白了,谢谢您提供的代码示例。问题,“从主窗口获取代码”是什么意思?你指的是代码隐藏吗?如果是,这是目前我从viewModels操作UI控件最简单的方法。它有时可能是最简单的选项,但不是MVVM。MVVM的全部目的是将视图逻辑与视图本身解耦。如果您打算直接在代码隐藏中操作视图元素,那么老实说,使用MVVM实际上没有任何意义,您也可以坚持使用“常规”WPF。如果您想充分利用WPF提供的功能,您确实需要进行适当的数据绑定。@Mark Feldman您介意演示如何在不使用代码隐藏的情况下从ViewModel更改标签的背景色吗?我想用最好的方法做这件事。非常感谢你,但是把它作为一个单独的问题发布(我会留意的)。所以当你开始偏离直线和狭窄的道路时,警察会有点生气刚刚添加了我自己的答案。我明白了,谢谢你的代码示例。问题,“从主窗口获取代码”是什么意思?你指的是代码隐藏吗?如果是,这是目前我从viewModels操作UI控件最简单的方法。它有时可能是最简单的选项,但不是MVVM。MVVM的全部目的是将视图逻辑与视图本身解耦。如果您打算直接在代码隐藏中操作视图元素,那么老实说,使用MVVM实际上没有任何意义,您也可以坚持使用“常规”WPF。如果您想充分利用WPF提供的功能,您确实需要进行适当的数据绑定。@Mark Feldman您介意演示如何在不使用代码隐藏的情况下从ViewModel更改标签的背景色吗?我想用最好的方法做这件事。非常感谢你,但是把它作为一个单独的问题发布(我会留意的)。所以当你开始偏离直线和狭窄的道路时,警察会有点生气刚刚添加了我自己的答案。