2012-04-25 78 views
5

我正在寻找一个解决方案和/或后面为什么绑定实例是一个DataTemplate内共享的合理性。这最终归结为在DataTemplate内部,似乎没有办法为生成的每个控件强制在DependencyProperty上绑定一个新实例。在所有情况下,这可能是一个公平和良好的假设,除非有ValidationRules代表特定于该控件实例的某个事件。绑定情况下被重新使用时ValidationRules不能共享

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

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

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

任何想法是非常感谢!

+0

我有完全相同的问题,并花了我一段时间才发现它是共享的绑定... 你是否发现你的问题有什么好的解决方案呢? 感谢 – 2012-12-06 12:39:30

+0

我找到解决这个问题的唯一办法是在控制的状态转变为创建一个自定义的每个验证/启用/所需方案结合,并交换了绑定。这实际上并不像听起来那么痛苦,我在解决方案方面取得了很大的成功。随着国家排列的增加,它变得不太理想。您可以想象,当您需要每个ValidationRule(s)/ Enabled/Required组合的绑定的自定义实例时,它有多混乱。我的场景只需要大约12个自定义绑定。如果你找到更好的东西,你必须告诉我。干杯! – phixed 2012-12-12 21:26:25

+1

我以前也遇到过这个问题。 当我发现Binding实例上的ValidationRules问题,以及在DataTemplate场景中重新使用Binding实例时,我也感到震惊。 我们有一个框架,把一个普通的有效性规则上的每个绑定,然后代表实际的验证工作,以像企业库的验证或其他任何外部 验证库。 – KoenJ 2013-09-11 11:56:57

回答

1

我建议你在DataTemplate的定义中使用x:Shared attribute

<DataTemplate x:Key="DataTemplateKey" DataType="{x:Type YourType}" x:Shared="False"> 
    ... 
</DataTemplate> 

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

相关问题