Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF处理转换器错误和视图模型验证_C#_Wpf_Validation_Mvvm_Converter - Fatal编程技术网

C# WPF处理转换器错误和视图模型验证

C# WPF处理转换器错误和视图模型验证,c#,wpf,validation,mvvm,converter,C#,Wpf,Validation,Mvvm,Converter,我有一个MVVM应用程序,它的INotifyDataErrorInfo都已设置并运行。目前,我可以验证我的所有属性,并阻止用户继续操作,直到所有错误得到处理。直到最近,当我们意识到我们的一些控件(文本框和标签组合用于显示数字和单位类型,即100mm)在值被删除/退格时没有显示红色错误装饰符时,一切都是美好的 控件上有一个转换器,它接收一个double并将其格式化为字符串,以便在文本框中显示。我们在convertback方法中发现了一个问题,在该方法中,如果convertback无法将字符串转换回

我有一个MVVM应用程序,它的INotifyDataErrorInfo都已设置并运行。目前,我可以验证我的所有属性,并阻止用户继续操作,直到所有错误得到处理。直到最近,当我们意识到我们的一些控件(文本框和标签组合用于显示数字和单位类型,即100mm)在值被删除/退格时没有显示红色错误装饰符时,一切都是美好的

控件上有一个转换器,它接收一个double并将其格式化为字符串,以便在文本框中显示。我们在convertback方法中发现了一个问题,在该方法中,如果convertback无法将字符串转换回double,则会发送Binding.DoNothing。我们将其改为dependencProperty.UnsetValue,并认为一切都会正常工作,但这暴露了一个更大的问题

我们现在遇到的问题是,viewmodel没有收到转换器出现故障的通知,我不知道如何做到这一点。当用户删除文本框内容时,将使用空字符串调用转换器。这个空字符串不能解析为double

我觉得我需要一种方法来通知VM convertback失败,以便它可以将属性标记为hasError。不过,我看不出有什么办法可以做到这一点。下面是convertback方法的代码

        public object[] ConvertBack(object value, Type[] targetTypes, object           parameter, CultureInfo culture)
    {
        var strVal = value as string;
        double dblVal = 0;
        bool isSuccess = double.TryParse(strVal, out dblVal);

        if (_systemUnits == SystemUnits.Metric && isSuccess)
        {
            return new[] { dblVal, Binding.DoNothing };
        }
        else if (_systemUnits != SystemUnits.Metric && isSuccess)
        {
            return new[] { Binding.DoNothing, dblVal };
        }
        else
        {
            return new[] { Binding.DoNothing, Binding.DoNothing };
        }
    }
}
我不确定还有哪些代码是相关的,但如果您认为有帮助的话,我愿意发布更多。谢谢你的时间

我觉得我需要一种方法来通知虚拟机

提供应用程序类的静态关闭,该应用程序类具有相关VM的最新实例,并且在转换器中访问该静态,并直接调用该静态的方法/属性以通知状态

-或-

我建议您创建与转换器工作相同的计算属性,以提供您提到的故障估计

然后,您就可以访问计算属性并执行需要完成的过程


下面是一个示例属性
IsOverLimit
,如果需要,可以对其进行绑定,并通过其
INotifyPropertyChange
等检查状态

public bool IsOverLimit { get { return ThreadCreationLimit > 120 } }

 public uint ThreadCreationLimit
    {
        get { return _ThreadCreationLimit; }
        set
        {
            _ThreadCreationLimit = value;
            OnPropertyChanged("ThreadCreationLimit");
            OnPropertyChanged("IsOverLimit");
        }
    }

我建议将属性转换为输入的值的实际类型(是文本——是的,它是一个数字加上一个单位名称,但一起只是文本),并验证VM中的内容。又便宜又快。其他选项包括创建一个结合了数字和单位的特殊结构,定义了一个静态“无效”值(如double.NaN),并在用户输入无效时返回该值。更复杂,但它不会给你太多的震动。@Will这就是我害怕的。我遇到的几乎每一个可行的解决方案都围绕着将属性转换为字符串。这对我来说非常不方便,但现在似乎没有更多的选择了。