无法共享ValidationRules时,在DataTemplates中重用的绑定实例

phi*_*xed 5 data-binding wpf datatemplate validationrules

我正在寻找一个解决方案和/或为什么在DataTemplate中共享Binding实例的合理性.这最终归结为这样一个事实:在DataTemplate中,似乎没有办法在DependencyProperty上为每个生成的控件强制执行Binding的新实例.在所有情况下,这可能是一个公平和良好的假设,除非有ValidationRules表示特定于该控件实例的某些内容.

为了详细说明(我可以提供代码,但我不认为这是必要的),我在IsEnabled上使用DependencyPropertyDescriptor来更新属于TextBox.Text Binding,DatePicker.Text Binding或ComboBox.SelectedValue Binding的一个或多个ValidationRules.等等.当未启用控件时,验证将是不同的或不期望的.

因此,ValidationRule的IsEnabled状态特定于单个控件,因为ValidationRule集合是Binding的一部分,Binding实例正在共享 - 每个最终共享该绑定的控件将更新/覆盖之前的IsEnabled值由先前生成的控件的IsEnabled值应用.

IsEnabled只是ValidationRule中的至少两个属性之一(另一个自定义IsRequired DependencyProperty),它表示应用Binding的控件的状态.在DataTemplate之外工作时(IE:未共享Binding实例),这非常有效,并根据控件的状态忽略/更改验证逻辑.我并没有关闭替代方案,但确实认为这是一个非常灵活和动态的选项,它允许Binding实例ValidationRule和规则的控制更改状态毫不费力地发展.这也让我避免了其他明显但更丑陋的选项,比如创建几个Bindings,每个Bindings代表ValidationRule控件属性的一个组合,并在DependencyPropertyDescriptor触发时切换整个绑定.不寒而栗

任何想法都非常感谢!

nep*_*nao 1

我建议您在 DataTemplate 定义中使用x:Shared 属性。

<DataTemplate x:Key="DataTemplateKey" DataType="{x:Type YourType}" x:Shared="False">
    ...
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

由于您使用它,WPF 将在每个请求上创建一个新的 DataTemplate 实例。