使用 MVVM Light 时处理复选框的最佳方式是什么
What is the best way to handle checkBoxes when using MVVM Light
我有几个复选框,其中 UI 会根据其状态发生变化。在代码中,每次单击复选框时我都会发送一条消息,一切正常,但我不确定这是否是处理复选框的最有效方法。抱歉,我是整个 WPF/MVVM.
的新手
这是我的做法...
XAML:
<Grid x:Name="LayoutRoot">
<CheckBox x:Name="checkBox" Command="{Binding CheckBoxCommand}" Content="My Check Box"/>
</Grid>
ViewModel:
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 类 添加代码,那么这意味着您可能做错了什么。
我有几个复选框,其中 UI 会根据其状态发生变化。在代码中,每次单击复选框时我都会发送一条消息,一切正常,但我不确定这是否是处理复选框的最有效方法。抱歉,我是整个 WPF/MVVM.
的新手这是我的做法...
XAML:
<Grid x:Name="LayoutRoot">
<CheckBox x:Name="checkBox" Command="{Binding CheckBoxCommand}" Content="My Check Box"/>
</Grid>
ViewModel:
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 类 添加代码,那么这意味着您可能做错了什么。