C# 管理按钮的IsEnabled属性
我的程序中有一个xaml窗口,其中有一个名为“保存”的按钮和一个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
文本框。我还有一个用于此窗口的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
。啊,检查编辑,我想你必须告诉你的文本框为每次击键发送更新事件。我刚刚测试了一下,似乎有效。宾果,就是这样。非常感谢。