XAML 按钮IsEnabled绑定无法正常工作

wvmv3b1j  于 2023-09-28  发布在  其他
关注(0)|答案(7)|浏览(163)

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

4c8rllxm1#

如果任何人仍然有问题,请确保IsEnabled属性位于Command属性之后。

<Button Command="{Binding StartCommand}" IsEnabled="{Binding StartEnabled}" />
  • 作品
<Button IsEnabled="{Binding StopEnabled}" Command="{Binding StopCommand}"  />
  • 不起作用
    请注意,我的两个命令总是可以执行。对我来说更容易解决。
v440hwme

v440hwme2#

如果使用的是命令,则单独绑定按钮的IsEnabled属性不是一个好主意。相反,您应该在命令的“CanExecute”中提供正确的值。这也将启用该按钮。

ki1q1bka

ki1q1bka3#

如果你使用的是RelayCommand,你可以使用第二个参数作为boolean方法来指示命令是否可以执行:

public RelayCommand(Action execute, Func<bool> canExecute);

使用方法:

this.DetermineCommand = new RelayCommand(this.Determine, () => this.IsValid);
kuhbmx9i

kuhbmx9i4#

从我在你发布的代码中看到的,如果没有调用this["SomeName"],你的SomethingIsValid将永远是false,这就是为什么你的按钮显示disabled。我的建议/解决方案是:
从xaml中删除IsEnabled绑定(如果命令绑定正常工作,则不需要此操作):

<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代码更改为如下所示(您当前的命令定义是OK的,因此不更改该部分)。下面的代码确保在执行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
8cdiaqws

8cdiaqws5#

你必须在ViewModel中实现INotifyPropertyChanged接口,这样当属性被更新时,视图也会被notfied。
看看这个https://msdn.microsoft.com/en-US/library/system.componentmodel.inotifypropertychanged%28v=vs.110%29.aspx

x9ybnkn6

x9ybnkn66#

如果你像这样使用命令:

[RelayCommand]
async Task Refresh()
{
    await LoadListAsync();
}

然后您可以将boolean作为参数传入Relay属性,如下所示:

[RelayCommand(CanExecute = nameof(CanRefresh))]
async Task Refresh()
{
    await LoadListAsync();
}

更多详细信息,请参阅MAUI文档。

piv4azn7

piv4azn77#

我通过绑定IsEnabled的值解决了这个问题。将其显式设置为False不起作用。

成功了:

<Button Text="Login" Command="{Binding LoginCommand}" IsEnabled="{Binding ButtonsEnabled}" />

这不起作用:

<Button Text="Login" Command="{Binding LoginCommand}" IsEnabled="False" />

相关问题