2012-04-25 82 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實例。

相關問題