小编man*_*nni的帖子

MVVM - 验证

我们试图在mvvm中弄清楚在业务逻辑或模型中进行验证的验证.我在业务逻辑中实现了异常类型的验证 - 可以在这里找到简化的图表: 替代文字

如果我们有很多输入彼此独立,那么没有问题,抛出异常,文本框会捕获一个标记,它为每个错误的输入设置了红色边框.但是,当我们有依赖值时,我们就遇到了麻烦.例如

  • 模型中的Value1和Value2必须不一样,所以我们在每个寻找equals值的函数中都有一个validate函数,如果发生这种情况则抛出异常

  • 现在,如果我们将Value1设置为0而将Value2设置为1,一切都很好

  • Value1在GUI中设置为1 - >这个被标记为红色,因为未触发其他值的验证,因此GUI中的Value2未标记为错误

  • 在GUI中将Value2设置为2,现在我们已达到有效状态,但只有Value2得到验证,因此Value1仍被标记为有错

有没有一个共同的模式来解决这个问题?我们不希望在两个文本框之间的GUI中引入依赖关系,因为此逻辑应仅存在于业务逻辑层中.

除了通过异常实现验证之外,还可以实现IDataErrorInfo接口,但问题仍然存在,没有办法强制依赖值再次验证它们的值,至少没有我能看到:)

任何帮助表示赞赏

欢呼,曼尼


[清理,删除不必要的步骤]


15.11.2010 - 第2部分

好的,在这里重新思考,我们将继续使用businesslogic层.这是我们当前计划的配置: 替代文字 (图像在这里缩小了一点,请在单独的窗口打开它以完整尺寸显示)一切都或多或少清晰,除了如果数据模型如何通知不同编辑器的所有视图模型/模型克隆在业务逻辑下变了.一种方法是跟踪创建它们的业务逻辑中的克隆模型.使用业务逻辑commit()更改数据模型时,可以向所有其他已注册的模型克隆通知更改并进一步传播它们.或者,业务逻辑可以发布所有视图模型订阅的事件,以便他们也能获得更改 - 任何人都可以给我一个提示更好的提示吗?

再次感谢您的帮助,抱歉,我是如此精神错乱;)

c# validation business-logic mvvm

16
推荐指数
1
解决办法
9521
查看次数

在双向绑定中使用IValueConverter和当前的DataContext

我遇到了转换器的问题,我用它来转换字符串和我们的时间格式.转换器本身工作正常,并实现如下:

    [ValueConversion(typeof(string), typeof(SimpleTime))]
    public class StringToSimpleTimeConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // convert from string to SimpleTime and return it
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            // convert value from SimpleTime to string and return it
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用转换器的XAML在usercontrol.resources中包含转换器本身,如下所示:

<converter:StringToSimpleTimeConverter x:Key="stringToSimpleTimeConverter"/>
Run Code Online (Sandbox Code Playgroud)

如果遇到属性(我在后台使用wpf工具包中的datagrid),则使用用于编辑simpletime的datatemplate:

<DataTemplate x:Key="SimpleTimeEditingTemplate">
        <TextBox Text="{Binding, Converter={StaticResource stringToSimpleTimeConverter}, Mode=TwoWay}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是转换器需要在绑定中指定路径,如果它是双向转换器(我需要在两个方向),但我想要设置的属性已经是当前的DataContext - 什么路径那我可以指定吗?

我能想到的唯一解决方法是在SimpleTime中引入一个虚拟属性,它只获取当前的SimpleTime或设置它.

public class SimpleTime
{
    ...
    public SimpleTime Clone
    {
        get { …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf datacontext converter ivalueconverter

6
推荐指数
1
解决办法
6851
查看次数