从 ViewModel 绑定 ValidationRule
Binding ValidationRule from ViewModel
我需要使用我的 ModelView
中的列表 'lFx'
<TextBox Grid.Row="2" Grid.Column="0"
Style="{StaticResource StyleTxtErr}"
Validation.ErrorTemplate="{StaticResource ValidationGrp}"
>
<TextBox.Text>
<Binding Path="sGrp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:cDataGrpRule lFx="{Binding lFx}"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
实际上,这段代码在“
不能将绑定设置为 lFx,...
绑定只能设置为 DependenxyObject 的 DependencyProperty
如何使用我的 ViewModel 中设置的对象初始化我的 ValidationRule 对象?
提前致谢。
埃里克
由于您只能绑定到依赖项 属性,正如错误消息所解释的那样,您将创建一个包装器 class,它派生自 DependencyObject
并公开一个依赖项 属性.
您还需要一个捕获当前 DataContext
:
的代理对象
public class BindingProxy : Freezable
{
protected override Freezable CreateInstanceCore() => new BindingProxy();
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy),
new PropertyMetadata(null));
}
然后你添加一个 CLR 属性 到 ValidationRule
class 即 returns 这个包装器类型的一个实例:
public class cDataGrpRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
//your validation logic...
return ValidationResult.ValidResult;
}
public Wrapper Wrapper { get; set; }
}
public class Wrapper : DependencyObject
{
public static readonly DependencyProperty lFxProperty =
DependencyProperty.Register("lFx", typeof(object), typeof(Wrapper));
public object lFx
{
get { return GetValue(lFxProperty); }
set { SetValue(lFxProperty, value); }
}
}
您可能要考虑重命名 属性 以符合 C# 命名约定。
XAML:
<TextBox Grid.Row="2" Grid.Column="0"
Style="{StaticResource StyleTxtErr}"
Validation.ErrorTemplate="{StaticResource ValidationGrp}">
<TextBox.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}"/>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="sGrp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:cDataGrpRule>
<local:cDataGrpRule.Wrapper>
<local:Wrapper lFx="{Binding Data.lFx, Source={StaticResource proxy}}"/>
</local:cDataGrpRule.Wrapper>
</local:cDataGrpRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
请参阅 this article 了解更多信息和完整示例。
我需要使用我的 ModelView
中的列表 'lFx'<TextBox Grid.Row="2" Grid.Column="0"
Style="{StaticResource StyleTxtErr}"
Validation.ErrorTemplate="{StaticResource ValidationGrp}"
>
<TextBox.Text>
<Binding Path="sGrp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:cDataGrpRule lFx="{Binding lFx}"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
实际上,这段代码在“
绑定只能设置为 DependenxyObject 的 DependencyProperty
如何使用我的 ViewModel 中设置的对象初始化我的 ValidationRule 对象?
提前致谢。 埃里克
由于您只能绑定到依赖项 属性,正如错误消息所解释的那样,您将创建一个包装器 class,它派生自 DependencyObject
并公开一个依赖项 属性.
您还需要一个捕获当前 DataContext
:
public class BindingProxy : Freezable
{
protected override Freezable CreateInstanceCore() => new BindingProxy();
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy),
new PropertyMetadata(null));
}
然后你添加一个 CLR 属性 到 ValidationRule
class 即 returns 这个包装器类型的一个实例:
public class cDataGrpRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
//your validation logic...
return ValidationResult.ValidResult;
}
public Wrapper Wrapper { get; set; }
}
public class Wrapper : DependencyObject
{
public static readonly DependencyProperty lFxProperty =
DependencyProperty.Register("lFx", typeof(object), typeof(Wrapper));
public object lFx
{
get { return GetValue(lFxProperty); }
set { SetValue(lFxProperty, value); }
}
}
您可能要考虑重命名 属性 以符合 C# 命名约定。
XAML:
<TextBox Grid.Row="2" Grid.Column="0"
Style="{StaticResource StyleTxtErr}"
Validation.ErrorTemplate="{StaticResource ValidationGrp}">
<TextBox.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}"/>
</TextBox.Resources>
<TextBox.Text>
<Binding Path="sGrp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:cDataGrpRule>
<local:cDataGrpRule.Wrapper>
<local:Wrapper lFx="{Binding Data.lFx, Source={StaticResource proxy}}"/>
</local:cDataGrpRule.Wrapper>
</local:cDataGrpRule>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
请参阅 this article 了解更多信息和完整示例。