使用数据模型范围中的命令

时间:2013-09-24 14:04:01

标签: c# wpf mvvm command

在我的程序中,我正在尝试为用户控件编写命令,该命令将切换几个控件的isEnabledisChecked属性。附加到我的用户控件的是视图模型和数据模型。我的命令和属性在我的数据模型中(首先,这是正确的实现吗?),我的视图模型中有我的数据模型的属性。

命令不起作用。我没有得到任何绑定错误,当我调试我的代码时,值正确更改。但是,没有视觉反馈。

我的视图模型在其构造函数中设置为用户控件的DataContext

我的数据绑定如下:

<CheckBox Command="{Binding Model.myCommand}" ... />

这是我的一个命令的示例:

public Command myCommand { get { return _myCommand; } }
private void MyCommand_C()
{
       if (_myCommand== true) //Checked
       {
           _checkBoxEnabled = true;
       }
       else //UnChecked
       {
           _checkBoxEnabled = false;
           _checkBox = false;
       }
}

为什么这些命令不起作用?

2 个答案:

答案 0 :(得分:1)

Commands应在ViewModel

中实施

您或在模型中,您应该将属性绑定到控件的IsCheckedIsEnabled属性,并且在命令中,更改属性将触发PropertyChanged事件,更新您的观点。

示例:

在您看来:

    <StackPanel>
        <Button Command="{Binding ToggleCommand}"/>
        <CheckBox IsChecked="{Binding Path=Model.IsChecked}"/>
        <CheckBox IsEnabled="{Binding Path=Model.IsEnabled}"/>
    </StackPanel>

视图模型:

public class MainWindowViewModel : NotificationObject
{
    public MainWindowViewModel()
    {
        Model = new MyModel();

        ToggleCommand = new DelegateCommand(() =>
            {
                Model.IsChecked = !Model.IsChecked;
                Model.IsEnabled = !Model.IsEnabled;
            });
    }

    public DelegateCommand ToggleCommand { get; set; }

    public MyModel Model { get; set; }
}

型号:

public class MyModel : INotifyPropertyChanged
{
    private bool _isChecked;
    private bool _isEnabled;

    public bool IsChecked
    {
        get
        {
            return _isChecked;
        }
        set
        {
            _isChecked = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsChecked"));
        }
    }

    public bool IsEnabled
    {
        get
        {
            return _isEnabled;
        }
        set
        {
            _isEnabled = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsEnabled"));
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

希望这有帮助

答案 1 :(得分:0)

首先,您的Command属性应该在您的ViewModel中,而不是您的数据模型中。

除此之外,您不应将CheckBox绑定到Command - 命令用于触发操作的元素(例如单击Button)。 CheckBox应绑定到bool属性。该属性应驻留的地方可以辩论,但我的意见是它应该在ViewModel中,以便您可以将属性更改通知逻辑保留在数据模型之外。

一个简单的例子:

public class MyViewModel : INotifyPropertyChanged
{
    private bool _myCheckValue;
    public bool MyCheckValue
    {
        get { return _myCheckValue; }
        set 
        {
            _myCheckValue = value;
            this.RaisePropertyChanged("MyCheckValue");
        }
    }

    //INotifyPropertyChange implementation not included...
}

然后在你的XAML中(假设ViewModel是DataContext):

<CheckBox IsChecked="{Binding MyCheckValue}" ... />