Int属性处理RelayCommand在MVVM

本文关键字:MVVM RelayCommand 处理 属性 Int | 更新日期: 2023-09-27 18:18:05

我有一个属性,看起来像这样:

private int _wertungvalue;
public int WertungValue
{
    get { return _wertungvalue; }
    set
    {
        _wertungvalue = value;
        RaisePropertyChanged(() => WertungValue);
    }
}

它被绑定到一个TextBox

<TextBox Text="{Binding WertungValue, Mode=TwoWay}"/>

所以用户可以输入任何他想要的东西(我不想要一个数字文本框!)用户输入"5",WertungValue的值为5。如果用户输入"Test",则弹出红色边框,并且WertungValue的值仍然是5!

现在我还有一个RelayCommand

RelayCommand(DeleteExecute,CanDelete);

在CanDelete中,我检查属性是否为int

private bool CanDelete()
{
    int ot = 0;
    if (int.TryParse(WertungValue.ToString(),out ot) == false)
        return false;
    else
        return true;
}

以便RelayCommand只在值为整数时才工作。这意味着当用户键入'Test'时,RelayCommand应该返回false。问题是它永远不会返回false,因为属性的值总是一个整数,但在View中它是一个字符串。

我不想让属性类型字符串或使用UpdateSourceTrigger=PropertyChanged在我的文本框。我也不想做一个只有数字的文本框…应该允许用户输入他想要的任何东西,但是RelayCommand应该只在他输入整数时才工作。

Int属性处理RelayCommand在MVVM

我认为对于int-property来说这是不可能的。当绑定更新属性时,它尝试将值转换为整数,这会在用户输入'Test'时导致异常,因此值永远不会更新并保持5。

我认为你需要两个属性:一个是string类型,另一个是int类型(或者int?)文本框被绑定到string属性,在setter中,你可以检查该值是否可以被解析,并相应地更新int属性。