Button.IsEnabled
无法正常使用。
我已经调试了代码,并且该属性的setter被" true"值。但该按钮仍处于禁用状态。
View.xaml:
<StackPanel Grid.Row="2" Margin="0,20,0,0" >
<Button Name="ButtonOk" Content="OK" Margin="0,0,4,0" IsEnabled="{Binding SomethingIsValid}" Command="{Binding CommandOk}" />
<Button Name="ButtonCancel" Content="Cancel" Margin="0,0,4,0" IsCancel="True" /
</StackPanel>
View.xaml.cs:
...
public View(ViewModel viewModel)
{
this.InitializeComponent();
this.viewModel = viewModel;
this.DataContext = viewModel;
}
视图模型:
public bool SomethingIsValid
{
get
{
return somethingIsValid;
}
set
{
this.somethingIsValid= value;
this.RaisePropertyChanged(() => this.SomethingIsValid);
}
}
#region IDataErrorInfo
public string this[string columnName]
{
get
{
this.SomethingIsValid= false;
if ("SomeName" == columnName)
{
if (string.IsNullOrEmpty(this.Status))
{
return "Please bla bla..";
}
}
this.SomethingIsValid = true;
return string.Empty;
}
}
public string Error
{
get
{
return string.Empty;
}
}
#endregion
public ICommand CommandOk
{
get
{
if (this.commandOk == null)
{
this.commandOk = new RelayCommand(this.CommandOkAktion, () => this.SomethingIsValid );
}
return this.commandOk;
}
}
答案 0 :(得分:7)
如果您正在使用命令,则单独绑定按钮的IsEnabled属性不是一个好主意。 相反,你应该在&#34; CanExecute&#34;中提供正确的值。命令。这也将启用该按钮。
答案 1 :(得分:2)
如果有人仍然遇到此问题 - 请确保您的IsEnabled属性位于Command属性之后。
<Button Command="{Binding StartCommand}" IsEnabled="{Binding StartEnabled}" />
- 作品
<Button IsEnabled="{Binding StopEnabled}" Command="{Binding StopCommand}" />
- 不起作用
请注意,我的两个命令都可以随时执行。对我来说更容易解决。
答案 2 :(得分:1)
在我们发布的代码中显示我可以看到的内容,如果没有调用this["SomeName"]
,则SomethingIsValid
始终为false
,这就是您的按钮显示disabled
的原因。所以我的建议/解决方案是:
从xaml中删除IsEnabled
绑定(如果你的Command绑定工作正常,你将不需要这样做):
<StackPanel Grid.Row="2" Margin="0,20,0,0" >
<Button Name="ButtonOk" Content="OK" Margin="0,0,4,0" Command="{Binding CommandOk}" />
<Button Name="ButtonCancel" Content="Cancel" Margin="0,0,4,0" IsCancel="True" /
</StackPanel>
将ViewModel代码更改为如下所示(您当前的Command定义正常,因此不对该部分进行任何更改)。下面的代码确保在执行CanCommandExecute
时,它会重新检查SomethingIsValid
:
public bool SomethingIsValid
{
get
{
return string.IsNullOrEmpty(Error);
}
}
public string this[string columnName]
{
get
{
switch(columnName)
{
case "SomeName":
{
if (string.IsNullOrEmpty(this.Status))
{
return "Please bla bla..";
}
break;
}
case "SomeOtherName":
{
if (string.IsNullOrEmpty(this.OtherProperty))
{
return "Please bla bla..";
}
break;
}
}
return string.Empty;
}
}
public string Error
{
get
{
return this["SomeName"]+this["SomeOtherName"];
}
}
#endregion
答案 3 :(得分:0)
您必须在ViewModel中实现INotifyPropertyChanged接口,因此当属性更新时,视图会被取消。
答案 4 :(得分:0)
如果使用的是RelayCommand,则可以将第二个参数用作布尔型方法,该布尔型方法指示命令是否可以执行:
public RelayCommand(Action execute, Func<bool> canExecute);
用法:
this.DetermineCommand = new RelayCommand(this.Determine, () => this.IsValid);
答案 5 :(得分:-1)
我通过绑定IsEnabled的值来解决了这个问题。明确地将其设置为False不起作用。
这有效:
<Button Text="Login" Command="{Binding LoginCommand}" IsEnabled="{Binding ButtonsEnabled}" />
这不起作用:
<Button Text="Login" Command="{Binding LoginCommand}" IsEnabled="False" />