按钮在视图模型中更新其绑定后未启用



我真的快疯了。我有一个对话框,其中有一对自增自减按钮,允许用户选择数量。按钮被绑定到视图模型中的委托命令,每个命令都有一个Action委托和一个Func canExecute。其思想是用户可以选择1到100之间的数字,因此canExecute参数被绑定到几个属性,这些属性用布尔值实现了这个逻辑。当程序启动时,默认数量为1,因此增量按钮被启用,递减按钮被禁用。但我们的想法是,当数字为2或更多时,用户可以减少数量,因此需要启用按钮。问题是减少按钮开始禁用,并且在数字更改时不更新其状态。
我试过把RaisePropertyChanged方法放在ViewModel的任何地方,我试过在XAML中使用IsEnabled属性,但似乎没有任何作用。最奇怪的部分是,一开始启用的增加按钮工作得很好,当它达到99时停止执行命令,但不会被禁用。我将向您展示代码,任何建议将不胜感激。谢谢。这是XAML:

<Button x:Name="cmdUp"
BorderBrush="LightSlateGray"
Grid.Column="1"
x:FieldModifier="private"
FontSize="10"
Content="▲"
Width="15"
Height="17"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Command="{Binding IncreaseQuantityCommand}"/>
<Button x:Name="cmdDown"
BorderBrush="LightSlateGray"
x:FieldModifier="private"
FontSize="10"
Grid.Column="1"
Content="▼"
Height="17"
Width="15"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
IsEnabled="{Binding CanDecrease}"
Command="{Binding DecreaseQuantityCommand}"  />

下面的代码:

/// <summary>
/// Interaction logic for QuantityModalView.xaml
/// </summary>
public partial class QuantityModalView : UserControl
{
private QuantityModalViewModel _quantityModalViewModel;
public QuantityModalView()
{
InitializeComponent();
_quantityModalViewModel = new QuantityModalViewModel();
DataContext = _quantityModalViewModel;
}
}

这是viewModel:

public class QuantityModalViewModel : ViewModelBase
{
private int _numValue;
public QuantityModalViewModel()
{
_numValue = 1;
DecreaseQuantityCommand = new DelegateCommand(DecreaseQuantity, () => CanDecrease);
IncreaseQuantityCommand = new DelegateCommand(IncreaseQuantity, () => CanIncrease);
}
public DelegateCommand IncreaseQuantityCommand { get; }
public DelegateCommand DecreaseQuantityCommand { get; }
public int NumValue
{
get { return _numValue; }
set
{
_numValue = value;
RaisePropertyChanged();
RaisePropertyChanged(nameof(CanDecrease));
}
}
public bool CanDecrease => NumValue >= 2;
public bool CanIncrease => NumValue < 99;

public void IncreaseQuantity()
{
NumValue++;

}
public void DecreaseQuantity()
{
NumValue--;

}
}

找到了,菜鸟错误。我忘了在我的属性中添加Command.RaiseCanExecuteChanged()方法。在拐角处走一小段路能做的事真让人惊讶!修复方法如下:

public int NumValue
{
get { return _numValue; }
set
{
_numValue = value;
RaisePropertyChanged();
RaisePropertyChanged(nameof(CanDecrease));
DecreaseQuantityCommand.RaiseCanExecuteChanged();
}
}

最新更新