【问题标题】:Int Property handling RelayCommand in MVVMMVVM 中的 Int 属性处理 RelayCommand
【发布时间】:2013-06-12 10:17:20
【问题描述】:

我有一个如下所示的属性:

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

它绑定到一个文本框

<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。我也不想只制作一个数字文本框...应该允许用户输入他想要的任何内容,但 RelayCommand 应该只在他输入整数时才起作用。

【问题讨论】:

  • 你不能为所欲为。您将收到绑定错误,并且您的“设置”将永远不会在您的财产上被调用。将UpdateSourceTrigger 设置为“PropertyChanged”并不能解决问题。您不需要将单个属性设为字符串......但您应该添加第二个属性,将您的文本框绑定到。

标签: c# mvvm int relaycommand


【解决方案1】:

我认为这对于 int 属性是不可能的。当 Binding 更新属性时,它会尝试将值转换为整数,这会在用户输入“测试”时导致异常,因此值永远不会更新并保持 5。

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

【讨论】:

  • K,谢谢。但我很好奇视图如何检查 Binding 类型。它必须做一个 TryParse (或其他)来检查输入的类型。而不是在财产中进行,而是在...中进行?我的意思是在 Binding 和 Property 之间必须有一些东西来检查输入的类型。
  • 它检查你的属性的类型并看到'int'。因此,它需要先将字符串转换为整数,然后才能调用 setter。如果此转换失败,则会引发异常并且永远不会调用您的属性的设置器。
  • 有什么方法可以访问这个异常(在我的 ViewModel 中)?
  • 这里有一些可能的解决方案:stackoverflow.com/questions/13335787/…
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多