按钮IsEnabled绑定无法正常工作

时间:2015-03-05 09:56:57

标签: c# wpf xaml

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

6 个答案:

答案 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接口,因此当属性更新时,视图会被取消。

看看这个:https://msdn.microsoft.com/en-US/library/system.componentmodel.inotifypropertychanged%28v=vs.110%29.aspx

答案 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" />