Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据模型范围内使用命令_C#_Wpf_Mvvm_Command - Fatal编程技术网

C# 在数据模型范围内使用命令

C# 在数据模型范围内使用命令,c#,wpf,mvvm,command,C#,Wpf,Mvvm,Command,在我的程序中,我试图为一个用户控件编写命令,该控件将切换一些控件的isEnabled和isChecked属性。附加到我的用户控件的是视图模型和数据模型。我的命令和属性在我的数据模型中(首先,这是正确的实现吗?) 命令不起作用。我没有得到任何绑定错误,当我调试代码时,值被正确更改。但是,没有视觉反馈 我的视图模型被设置为其构造函数中用户控件的DataContext 我的数据是这样绑定的: <CheckBox Command="{Binding Model.myCommand}" ... /&

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

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

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

我的数据是这样绑定的:

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

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

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

除此之外,您不应该将
复选框
绑定到
命令
-命令用于触发操作的元素(例如单击
按钮
)。
复选框
应绑定到
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):


命令应在
视图模型中实现

在那里或模型中,应该将属性绑定到控件的
IsChecked
IsEnabled
属性,在命令中,更改属性将触发
PropertyChanged
事件,该事件将更新视图

例如:

在你看来:

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

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
}

希望这有帮助

您以完全错误的方式使用命令。对于初学者,您将其绑定到
myCommand
,而模型中的名称为
myCommand\u C
请告诉我如何正确执行。我应该将它绑定到
模型。MyCommand_C
?请阅读以下内容:。我甚至应该使用命令来执行这些操作吗?我使用Prism框架,因此使用
DelegateCommand
RaisePropertyChanged
lambda表达式,但是这个概念在MVVM中非常基本,并且可以在任何MVVM框架中完成。这一切都是有意义的,但是,如果我将所有属性移到我的ViewModel,我的数据模型有什么意义呢?@Ericafterdark根据您的评论更新了我的答案。希望这能让事情变得更糟clear@Ericafterdark您不必将任何属性移动到
ViewModel
。您可以使用绑定中的
路径
直接绑定到它们。。。
    <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
}