Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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_Data Binding_Dependency Properties - Fatal编程技术网

C# WPF:绑定到验证规则';依附财产

C# WPF:绑定到验证规则';依附财产,c#,wpf,data-binding,dependency-properties,C#,Wpf,Data Binding,Dependency Properties,我想根据标准规则验证文本框值,其中两个是最小值和最大值。问题是,我需要配置这个值(例如在设置文件中) 我有一个验证规则: public class TextBoxWithIntegerValidation : ValidationRule { private Int32RangeChecker _validRange; public Int32RangeChecker ValidRange { get { retu

我想根据标准规则验证文本框值,其中两个是最小值和最大值。问题是,我需要配置这个值(例如在设置文件中)

我有一个验证规则:

public class TextBoxWithIntegerValidation : ValidationRule
    {
        private Int32RangeChecker _validRange;

        public Int32RangeChecker ValidRange
        {
            get { return _validRange; }
            set { _validRange = value; }
        }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            var str = value as string;
            if (str == null)
            {
                return new ValidationResult(false, Resources.TextResources.TextBoxIsEmpty_ErrorMessage);
            }

            int intValue = -1;
            if (!int.TryParse(str, out intValue))
            {
                return new ValidationResult(false, Resources.TextResources.TextBoxNotIntegerValue_ErrorMessage);
            }

            if (intValue < ValidRange.Minimum)
            {
                return new ValidationResult(false, 
                    string.Format(Resources.TextResources.TextBoxValueLowerThanMin_ErrorMessage, ValidRange.Minimum));
            }

            return new ValidationResult(true, null);
        }
    }
和文本框验证:

<TextBox>
<TextBox.Text>
    <Binding Path="Interval" UpdateSourceTrigger="PropertyChanged" ValidatesOnNotifyDataErrors="True">
        <Binding.ValidationRules>
            <validationRules:TextBoxWithIntegerValidation>
                <validationRules:TextBoxWithIntegerValidation.ValidRange>
                    <validationRules:Int32RangeChecker
                            Minimum="{Binding IntervalMinValue}"
                        />
                </validationRules:TextBoxWithIntegerValidation.ValidRange>
            </validationRules:TextBoxWithIntegerValidation>
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>

文本框放在UserControl中,相应的ViemModel放在control DataContext中


问题是:属性IntervalMinValue未绑定到验证规则。如果我手动设置,效果很好,但与绑定无关。

问题在于Int32RangeChecker对象附加到一个不属于可视树的对象,因此无法访问视图模型。如果查看输出窗口,您将看到此错误

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IntervalMinValue; DataItem=null; target element is 'Int32RangeChecker' (HashCode=32972388); target property is 'Minimum' (type 'Int32')
要解决此问题,需要将最小属性的绑定连接到可视化树的元素。一种方法是添加一个不可见的伪元素并绑定到它的数据上下文

    <FrameworkElement x:Name="dummyElement" Visibility="Hidden"/>
    <TextBox>
        <TextBox.Text>
            <Binding Path="Interval" UpdateSourceTrigger="PropertyChanged" ValidatesOnNotifyDataErrors="True">
                <Binding.ValidationRules>
                    <local:TextBoxWithIntegerValidation>
                        <local:TextBoxWithIntegerValidation.ValidRange>
                            <local:Int32RangeChecker
                        Minimum="{Binding Source={x:Reference dummyElement}, Path=DataContext.IntervalMinValue}"
                    />
                        </local:TextBoxWithIntegerValidation.ValidRange>
                    </local:TextBoxWithIntegerValidation>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

问题在于Int32RangeChecker对象附加到不属于可视树的对象,因此无法访问视图模型。如果查看输出窗口,您将看到此错误

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IntervalMinValue; DataItem=null; target element is 'Int32RangeChecker' (HashCode=32972388); target property is 'Minimum' (type 'Int32')
要解决此问题,需要将最小属性的绑定连接到可视化树的元素。一种方法是添加一个不可见的伪元素并绑定到它的数据上下文

    <FrameworkElement x:Name="dummyElement" Visibility="Hidden"/>
    <TextBox>
        <TextBox.Text>
            <Binding Path="Interval" UpdateSourceTrigger="PropertyChanged" ValidatesOnNotifyDataErrors="True">
                <Binding.ValidationRules>
                    <local:TextBoxWithIntegerValidation>
                        <local:TextBoxWithIntegerValidation.ValidRange>
                            <local:Int32RangeChecker
                        Minimum="{Binding Source={x:Reference dummyElement}, Path=DataContext.IntervalMinValue}"
                    />
                        </local:TextBoxWithIntegerValidation.ValidRange>
                    </local:TextBoxWithIntegerValidation>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>


如果需要可配置的
Min
Max
,请让它们查看模型属性以及
Value
。是的,它们在虚拟机中。但是我无法将VM属性绑定到验证最小值、最大DPs。如果需要可配置的
Min
Max
,请让它们查看模型属性以及
值。是的,它们在VM中。但我无法将VM属性绑定到验证最小值、最大DPs。非常感谢。花了几个小时绕着它跳舞,最后!令人惊叹的。非常感谢。花了几个小时绕着它跳舞,最后!