Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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# 管理按钮的IsEnabled属性_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 管理按钮的IsEnabled属性

C# 管理按钮的IsEnabled属性,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我的程序中有一个xaml窗口,其中有一个名为“保存”的按钮和一个文本框。我还有一个用于此窗口的ViewModel。在ViewModel中,我在按钮上为文本框设置了字符串属性,为启用了属性。我希望按钮仅在文本框中有文本时启用 xaml: <Button IsEnabled="{Binding SaveEnabled}" ... /> <TextBox Text="{Binding Name}" ... /> //Property for Name public strin

我的程序中有一个xaml窗口,其中有一个名为“保存”的按钮和一个
文本框。我还有一个用于此窗口的ViewModel。在ViewModel中,我在按钮上为
文本框
设置了
字符串
属性,为
启用了
属性。我希望按钮仅在
文本框中有文本时启用

xaml:

<Button IsEnabled="{Binding SaveEnabled}" ... />
<TextBox Text="{Binding Name}" ... />
//Property for Name
public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        NotifyPropertyChange(() => Name);

        if (value == null)
        {
            _saveEnabled = false;
            NotifyPropertyChange(() => SaveEnabled);
        }
        else
        {
            _saveEnabled = true;
            NotifyPropertyChange(() => SaveEnabled);
        }
    }
}

//Prop for Save Button -- IsEnabled
public bool SaveEnabled
{
    get { return _saveEnabled; }
    set
    {
        _saveEnabled = value;
        NotifyPropertyChange(() => SaveEnabled);
    }
}
我想我的主要问题是,关于这个问题,我应该把代码放在哪里?正如您在上面所看到的,我尝试将其放入
Name
属性的
setter
,但没有成功。您可以执行以下操作:

public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        NotifyPropertyChanged(() => Name);
        NotifyPropertyChanged(() => SaveEnabled);
    }
}

public bool SaveEnabled
{
    get { return !string.IsNullOrEmpty(_name); }
}
编辑:将其添加到xaml中:

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}">...</TextBox>
。。。
您只需执行以下操作:

public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        NotifyPropertyChanged(() => Name);
        NotifyPropertyChanged(() => SaveEnabled);
    }
}

public bool SaveEnabled
{
    get { return !string.IsNullOrEmpty(_name); }
}
编辑:将其添加到xaml中:

<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}">...</TextBox>
。。。

使用MVVM中使用的ICommand:

private ICommand _commandSave;
public ICommand CommandSave
{
    get { return _commandSave ?? (_commandSave = new SimpleCommand<object, object>(CanSave, ExecuteSave)); }
}

private bool CanSave(object param)
{
    return !string.IsNullOrEmpty(Name);
}
private void ExecuteSave(object param)
{

}
private ICommand\u commandSave;
公共ICommand命令保存
{
获取{return _commandSave???(_commandSave=newsimplecommand(CanSave,ExecuteSave));}
}
私有布尔可保存(对象参数)
{
return!string.IsNullOrEmpty(Name);
}
私有void ExecuteSave(对象参数)
{
}
然后在XAML代码中使用以下命令

<TextBox Command="{Binding CommandSave}" ... />


根据您使用的框架,命令类的工作原理不同。对于一般实现,我建议。

使用MVVM中使用的ICommand:

private ICommand _commandSave;
public ICommand CommandSave
{
    get { return _commandSave ?? (_commandSave = new SimpleCommand<object, object>(CanSave, ExecuteSave)); }
}

private bool CanSave(object param)
{
    return !string.IsNullOrEmpty(Name);
}
private void ExecuteSave(object param)
{

}
private ICommand\u commandSave;
公共ICommand命令保存
{
获取{return _commandSave???(_commandSave=newsimplecommand(CanSave,ExecuteSave));}
}
私有布尔可保存(对象参数)
{
return!string.IsNullOrEmpty(Name);
}
私有void ExecuteSave(对象参数)
{
}
然后在XAML代码中使用以下命令

<TextBox Command="{Binding CommandSave}" ... />


根据您使用的框架,命令类的工作原理不同。对于一般实现,我建议。

抱歉,这没有创建任何更改。是否附加viewmodel?还要检查你的xaml。。。通常这是有效的。事实上,即使是您最初的实现也应该可以工作,但是您的绑定可能有问题。我没有收到任何绑定错误。我的viewModel是正确xaml窗口的
DataContext
。啊,检查编辑,我想你必须告诉你的文本框为每次击键发送更新事件。我刚刚测试了一下,似乎有效。宾果,就是这样。非常感谢。抱歉,这没有造成任何更改。是否附加viewmodel?还要检查你的xaml。。。通常这是有效的。事实上,即使是您最初的实现也应该可以工作,但是您的绑定可能有问题。我没有收到任何绑定错误。我的viewModel是正确xaml窗口的
DataContext
。啊,检查编辑,我想你必须告诉你的文本框为每次击键发送更新事件。我刚刚测试了一下,似乎有效。宾果,就是这样。非常感谢。