使用DependencyProperty绑定InputValidation附加数据 [英] Binding InputValidation additional data using DependencyProperty

查看:61
本文介绍了使用DependencyProperty绑定InputValidation附加数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有点缺少这里的东西:我在数据模板中使用输入验证(有效),并且需要向验证提供其他数据(无效).使用硬编码"值(请参见下面的代码中的注释)有效,但使用绑定则无效.

kind of missing here something: I'm using input Validation in a datatemplate (which works) and need to supply additional data to the validation (which doesn't work). Using "hard-coded" values (see comment in code below) works, using the binding doesn't.

数据模板应用于在listView中显示的元素(具有值","low_lim"和"high_lim"属性)(这也有效).我想我只是束手无策.

The datatemplate is applied to elements (which have a "value", "low_lim" and "high_lim" properties) displayed in an listView (this also works). I think I just can't wrap my head around binding.

也许我只是想长期关注这个问题.如果我是对的,这是DP的某种视觉树"问题...

May be I just looked to long at this problem. If I'm right this is some kind of "visual-tree" problem with the DP...

任何帮助表示赞赏.

    <DataTemplate DataType="{x:Type OptionA}" >
            <TextBox Width="100" Validation.ErrorTemplate="{StaticResource validationErrorTemplate}">
                <TextBox.Text>
                    <Binding Path="value" UpdateSourceTrigger="PropertyChanged">
                        <Binding.ValidationRules>
                            <val:NumberOptionValidator>
                                <val:NumberOptionValidator.validRange>
                                    <val:Range low_lim="{Binding low_lim}" high_lim="{Binding high_lim}"/>
                                    <!--<val:Range low_lim="1" high_lim="2"/>-->
                                </val:NumberOptionValidator.validRange>
                            </val:NumberOptionValidator>
                        </Binding.ValidationRules>
                    </Binding>
                </TextBox.Text>
            </TextBox>
    </DataTemplate>

推荐答案

我建议您在OptionA上实现IDataErrorInfo,而不要使用验证规则.

I'd suggest you implement IDataErrorInfo on OptionA and not use the validation rule.

根据 https://何时使用验证规则与IDataErrorInfo对比"部分中的//blogs.msdn.microsoft.com/wpfsdk/2007/10/02/data-validation-in-3-5/业务层验证逻辑":

According to https://blogs.msdn.microsoft.com/wpfsdk/2007/10/02/data-validation-in-3-5/ in the "When to use Validation Rules vs. IDataErrorInfo" section, for "UI or business-layer validation logic":

使用验证规则: 验证逻辑与数据源分离,可以在控件之间重用.

Use Validation Rules: The validation logic is detached from the data source, and can be reused between controls.

使用IDataErrorInfo:验证逻辑更靠近源.

Use IDataErrorInfo: The validation logic is closer to the source.

这里有一些代码可以帮助您入门.

Here is some code to get you started.

XAML:

<Window x:Class="WpfApplication33.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication33"
        xmlns:val="clr-namespace:WpfApplication33"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:VM />
    </Window.DataContext>
    <Window.Resources>
        <ControlTemplate x:Key="validationErrorTemplate">
            <StackPanel Orientation="Horizontal">
                <AdornedElementPlaceholder x:Name="textBox"/>
                <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
            </StackPanel>
        </ControlTemplate>
        <DataTemplate DataType="{x:Type local:OptionA}">
            <TextBox Width="100"
                     Validation.ErrorTemplate="{StaticResource validationErrorTemplate}"
                     Text="{Binding value, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" />
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListView ItemsSource="{Binding Items}" />
    </Grid>
</Window>

CS:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication33
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

    public class VM
    {
        public List<OptionA> Items { get; set; }
        public VM()
        {
            Items = new List<OptionA>() {
                new OptionA() {value=1, low_lim = 0, high_lim = 2 },
                new OptionA() {value=2, low_lim = 3, high_lim = 4 }, // too low
                new OptionA() {value=3, low_lim = 2, high_lim = 5 },
                new OptionA() {value=4, low_lim = 6, high_lim = 9 }, // too low
                new OptionA() {value=5, low_lim = 0, high_lim = 4 }, // too high
            };
        }
    }

    public class OptionA : INotifyPropertyChanged, IDataErrorInfo
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private void OPC(string name) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(name)); }

        private int _value, _low_lim, _high_lim;
        public int value { get { return _value; } set { if (_value != value) { _value = value; OPC("value"); } } }
        public int low_lim { get { return _low_lim; } set { if (_low_lim != value) { _low_lim = value; OPC("low_lim"); } } }
        public int high_lim { get { return _high_lim; } set { if (_high_lim != value) { _high_lim = value; OPC("high_lim"); } } }

        #region IDataErrorInfo
        public string Error
        {
            get
            {
                return null;
            }
        }

        public string this[string columnName]
        {
            get
            {
                string err = null;
                if (columnName == "value")
                {
                    if (value < low_lim || value > high_lim)
                        err = string.Format("Value is out of the range of {0} to {1}.", low_lim, high_lim);
                }
                return err;
            }
        }
        #endregion
    }
}

屏幕截图:

这篇关于使用DependencyProperty绑定InputValidation附加数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆