gpt4 book ai didi

c# - 如何将 xaml 中的值绑定(bind)到验证规则?

转载 作者:行者123 更新时间:2023-12-03 04:16:21 26 4
gpt4 key购买 nike

我是 .net 开发的新手,所以请在这里帮助我。

我正在尝试通过 xaml 数据绑定(bind)将值从 C# 类传递到验证规则。

C# 类:

public class NumericDoubleUpDownValueContainerVM : SimpleValueContainerVM<string>
{
public NumericDoubleUpDownValueContainerVM(double value, double minValue, double maxValue, int decimalPlace) : base(value.ToString())
{
this.MinimumValue = minValue;
this.MaximumValue = maxValue;
this.DecimalPlaces = decimalPlace;
}

public double MinimumValue { get; set; }

public double MaximumValue { get; set; }

public int DecimalPlaces { get; set; }

public override void UpdatePropertyValue(object value, string propertyName = "")
{
this.Value = Convert.ToString(value);
}
}

这里SimpleValueContainerVM<T>是一个通用类,用于从相应的 UI 元素获取和设置值。

Xaml 代码:

<DataTemplate DataType="{x:Type VM:NumericDoubleUpDownValueContainerVM}" >
<Grid x:Name="Maingrid" >
<WPFStyles.CustomControls:NumericUpDown Minimum="{Binding MinimumValue}" Maximum="{Binding MaximumValue}" x:Name="Value" Width="{Binding ActualWidth, ElementName=Maingrid}"
VerticalAlignment="Center" YIncrementValue="0.1" DecimalPlaces ="{Binding DecimalPlaces}"
ToolTip="{Binding ValueToolTip, Converter={x:Static utils:StringToLocalizedStringConverter.Instance}, ConverterParameter=ToolTip}">
<Binding Path="Value" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay" ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<validationRule:DoubleValidationRule/>
<validationRule:ValueWithinLimitsRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" />
</Binding.ValidationRules>
</Binding>
</WPFStyles.CustomControls:NumericUpDown>
</Grid>
</DataTemplate>

这里的 ValueWithinLimits 规则是正在使用的规则:

验证规则如下:

    public class ValueWithinLimitsRule : ValidationRule
{
public double MaxVal { get; set; }

public double MinVal { get; set; }

public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value != null)
{
if (Convert.ToDouble(value.ToString()) > this.MaxVal || Convert.ToDouble(value.ToString()) < this.MinVal)
{
return new ValidationResult(false, null);
}
else
{
return new ValidationResult(true, null);
}
}

return new ValidationResult(false, null);
}
}

我尝试过类似的方法

<validationRule:ValueWithinLimitsRule ValidatesOnTargetUpdated="True" ValidationStep="RawProposedValue" MinVal="0" MaxVal="100"/>

而且效果很好。

现在我想使用 NumericDoubleUpDownValueContainerVM 的属性

MinimumValue and MaximumValue

代替 0 和 100。

我尝试过谷歌搜索并了解依赖属性和对象,但无法掌握它。

我非常感谢任何帮助。

最佳答案

您可以创建一个派生自 DependencyObject 的包装类并公开依赖属性。然后,将 CLR 属性添加到返回此包装器类型的实例的 ValidationRule 类。

public class AgeValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{

string text = value.ToString();
int age;
int.TryParse(text, out age);
if (age < 10 || age > this.Wrapper.MaxAge)
return new ValidationResult(false, "Invalid age.");

return ValidationResult.ValidResult;
}

public Wrapper Wrapper { get; set; }
}

public class Wrapper : DependencyObject
{
public static readonly DependencyProperty MaxAgeProperty =
DependencyProperty.Register("MaxAge", typeof(int),
typeof(Wrapper), new FrameworkPropertyMetadata(int.MaxValue));

public int MaxAge
{
get { return (int)GetValue(MaxAgeProperty); }
set { SetValue(MaxAgeProperty, value); }
}
}

XAML:

<TextBox xmlns:local="clr-namespace:WpfApplication1">
<TextBox.Text>
<Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:AgeValidationRule>
<local:AgeValidationRule.Wrapper>
<local:Wrapper MaxAge="{Binding MaxAge}"/>
</local:AgeValidationRule.Wrapper>
</local:AgeValidationRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

请参阅以下文章了解更多信息和完整示例。

WPF:将数据绑定(bind)值传递到验证规则: https://social.technet.microsoft.com/wiki/contents/articles/31422.wpf-passing-a-data-bound-value-to-a-validation-rule.aspx

关于c# - 如何将 xaml 中的值绑定(bind)到验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46519802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com