我正在使用MVVM创建一个对话框,提示用户输入一个http:// URL到KML文件。当URL格式正确时,需要启用“确定”按钮,当URL格式不正确时,需要禁用它。
现在按钮被绑定到ICommand,CanExecute()的逻辑如下所示:
return !string.IsNullOrEmpty(CustomUrl);
每次按键时都会引发命令的CanExecuteChanged事件,到目前为止它运行良好。
现在我想做一些实际的验证。我知道这样做的唯一方法如下:
try
{
var uri = new Uri(CustomUrl);
}
catch (UriFormatException)
{
return false;
}
return true;
这不是bueno,特别是因为每次按键都会进行验证。我可以这样做,以便在用户点击OK按钮时验证URI,但我宁愿不这样做。除了捕获异常之外,还有更好的方法来验证URI吗?
答案 0 :(得分:35)
是 - 您可以将静态方法Uri.IsWellFormedUriString
用于此
return Uri.IsWellFormedUriString (CustomUrl, UriKind.Absolute);
答案 1 :(得分:7)
在我看来,可能的解决方案是两个:
Uri.TryCreate
方法以避免异常(如果您不需要创建Uri对象,则可以使用Uri.IsWellFormedUriString
方法); 我更愿意使用第二种选择,创建正确的RegEx可能很困难并且可能导致许多问题。
答案 2 :(得分:1)
您可以将ValidationRules添加到控件中,验证将“通过魔法”完成。
答案 3 :(得分:0)
您可以使用Regex.IsMatch
而且,这是一个reliable pattern:
\ B((:[AZ] [\ W - ] +:(:(Ⅰ')?/ {1,3} | [A-Z0-9%])| WWW \ d {0,3 } | [A-Z0-9 .-] + [AZ] {2,4} /):[<>(^ \ S(+ |(([^ \ S [] [])〕 ()<>] + |(([^ \ S()<>] +)))))+(?:(([^ \ S()<>] + | (([^ \ S()<>] +))))| [^ \ s`()[] {} ;:'!”,<&GT ;?«»‘’ '']))
答案 4 :(得分:0)
由于您已经挂钩击键事件,您可以对字符串使用正则表达式验证,然后由您决定是将其标记为无效还是根本不允许它。此post类似,并且具有有效URI的正则表达式。