0

在我的程序中,我正在尝试为用户控件编写命令,该命令将切换几个控件的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;
       }
}

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

4

2 回答 2

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
}

希望这可以帮助

于 2013-09-24T14:23:44.190 回答
0

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

除此之外,您不应该将 a 绑定CheckBox到 a Command- 命令用于触发动作的元素(例如单击 a Button)。ACheckBox应该绑定到一个bool属性。可以讨论属性应该驻留的位置,但我认为它应该在 ViewModel 中,这样您就可以将 Property Changed Notification 逻辑排除在数据模型之外。

一个简单的例子:

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}" ... />
于 2013-09-24T14:22:22.277 回答