C# “一个人是怎么做的?”;禁用";WPF中使用MVVM模式的按钮?
我正在努力掌握WPF和MVVM,并取得了良好的进展。WPF和MVVM方面的工作进展顺利 但是,XAML和数据绑定方面完全是另一回事:) 我将如何“禁用”按钮 例如,我的视图模型中有一个CanClose属性,用于确定应用程序当前是否可以关闭。如果工作线程停止执行某些操作,那么该属性设置为false,我希望灰显按钮,或者通过某种绑定以某种方式直观地禁用关闭按钮 我该怎么做呢 谢谢 编辑- 可惜我只能接受一个答案 这两个答案对我帮助很大。在Kent的帖子中,他进一步解释了为什么应该在应用程序中实现命令基础结构,而不是像我所问的那样禁用按钮: 我原来问题的答案是: 只需将按钮的属性绑定到CanClose:C# “一个人是怎么做的?”;禁用";WPF中使用MVVM模式的按钮?,c#,wpf,xaml,.net-3.5,C#,Wpf,Xaml,.net 3.5,我正在努力掌握WPF和MVVM,并取得了良好的进展。WPF和MVVM方面的工作进展顺利 但是,XAML和数据绑定方面完全是另一回事:) 我将如何“禁用”按钮 例如,我的视图模型中有一个CanClose属性,用于确定应用程序当前是否可以关闭。如果工作线程停止执行某些操作,那么该属性设置为false,我希望灰显按钮,或者通过某种绑定以某种方式直观地禁用关闭按钮 我该怎么做呢 谢谢 编辑- 可惜我只能接受一个答案 这两个答案对我帮助很大。在Kent的帖子中,他进一步解释了为什么应该在应用程序中实现命令
<Button IsEnabled="{Binding CanClose}"/>
如果您返回CanExecute of ICommand且值为false,则按钮将被禁用。因此,无论您的按钮绑定到哪个命令,都可以在您想要禁用它时返回CanExecute值false。通过使用命令模式。在视图模型中:
public class MyViewModel : ViewModel
{
private readonly ICommand someCommand;
public MyViewModel()
{
this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);
}
public ICommand SomeCommand
{
get { return this.someCommand; }
}
private void DoSomething(object state)
{
// do something here
}
private bool CanDoSomething(object state)
{
// return true/false here is enabled/disable button
}
}
在您的XAML中:
<Button Command="{Binding SomeCommand}">Do Something</Button>
做点什么
阅读以了解有关DelegateCommand
的更多信息此命令也适用:
查看:
<Button>
<Button.Style>
<Style>
<Setter Property="Content" Value="Scream" />
<Style.Triggers>
<DataTrigger Binding="{Binding btnEnabled}" Value="True">
<Setter Property="IsEnabled" Value="True" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
private bool _btnEnabled;
public bool btnEnabled
{
get { return _btnEnabled; }
set
{
if (_btnEnabled != value)
{
_btnEnabled = value;
OnPropertyChanged();
}
}
}
ViewModel文件中的更改: 公共布尔值已禁用 { 获取{return\u isButtonEnabled;}
set
{
if (_isButtonEnabled == value)
{
return;
}
_isButtonEnabled = value;
OnPropertyChanged("IsButtonEnabled");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
按钮的XAML文件中的更改:IsEnabled=“{Binding IsButtonEnabled}”没门,真的那么简单吗?我不知道我怎么会忽略这一点。让我试试。谢谢,我不敢相信我忽略了这个问题如此简单的答案。值得注意的是,如果你采用MVVM方法,并且使用命令及其CanExecute属性,根据microsoft文档,你不应该使用IsEnabled属性。它在文档中并标记为重要:很好的链接,谢谢你提供的信息。今天下午我有额外的空闲时间时,我会阅读整个内容。我认为DelegateCommand是你自己的命令模式实现,还是在.net framework中我遗漏了什么?@IanP DelegateCommand是Prism的一部分这似乎是这些天来编写WPF应用程序的实际方式……嗯……不知道DelegateCommand做什么,这对我的帮助并不像我希望的那样大……萝拉——肯特在他的博客上有一个指向DelegateCommand实现示例的链接。再次感谢!不幸的是,链接已经失效,这使得这个答案毫无用处。