管理按钮的IsEnabled属性

时间:2013-11-07 20:33:06

标签: c# wpf xaml mvvm

我的程序中有一个xaml窗口,其中有一个名为“Save”的按钮和一个textBox。我也有一个ViewModel用于此窗口。在ViewModel中,stringtextBox属性,按钮上有bool IsEnabled属性。我希望只有在textBox

中有文字时才会启用该按钮

XAML:

<Button IsEnabled="{Binding SaveEnabled}" ... />
<TextBox Text="{Binding Name}" ... />

ViewModel属性:

//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);
    }
}

我认为我的主要问题是,我在哪里提出有关此问题的代码?正如您在上面所看到的,我已尝试将其放入setter属性的Name中,但它没有成功。

2 个答案:

答案 0 :(得分:2)

你可以这样做:

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>

答案 1 :(得分:2)

使用MVVM中使用的ICommands:

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)
{

}

然后在XAML代码中使用以下内容

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

根据您使用的框架,命令类的工作方式不同。对于通用实现,我建议Relay Command