Int属性处理MVVM中的RelayCommand

时间:2013-06-12 10:17:20

标签: c# mvvm int relaycommand

我有一个看起来像这样的房产:

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中它是一个字符串。

我不想让属性键入字符串或在TextBox中使用UpdateSourceTrigger = PropertyChanged。我也不想只创建一个数字TextBox ...应该允许用户键入他想要的任何内容,但是RelayCommand只能在他输入整数时才能工作。

1 个答案:

答案 0 :(得分:1)

我不认为使用int属性可以实现这一点。当Binding更新属性时,它会尝试将值转换为整数,这会在用户输入“Test”时导致异常,因此该值永远不会更新并保持为5。

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