2012-04-25 7 views
5

Bir Bağlama örneğinin bir DataTemplate içinde paylaşılmasının ardında yatan bir çözüm ve/veya rasyonellik arıyorum. Bu sonuçta, bir DataTemplate içinde, oluşturulan her denetim için Bağımlılık Özelliği üzerinde yeni bir Bağlama örneğini zorlamak için hiçbir yol olmadığı gerçeğine iner. Bu, muhtemelen, kontrolün örneği hakkında belirli bir şeyi temsil eden ValidationRules'in dışında, her durumda adil ve iyi bir varsayımdır. Ben bir TextBox.Text Bağlama ait bir veya daha fazla ValidationRules güncellemek için IsEnabled bir DependencyPropertyDescriptor kullanmak ayrıntılı içinValidationRules paylaşılamadığında DataTemplates'de kullanılan bağlayıcı örnekleri

(I kodu sağlayabilir, ama gerekli olduğuna inanmıyorum), DatePicker.Text Bağlama veya ComboBox.SelectedValue Binding, vb. Bir kontrol etkin olmadığında, onaylama farklı veya istenmeyen olacaktır. Bu nedenle, ValidationRule'un IsEnabled durumu tekil denetime özgüdür ve ValidationRule Koleksiyonu Bağlama ve Bağlama örneğinin bir parçası olduğundan, bu bağlamayı paylaşan her denetimin güncelleneceği/geçersiz kılınacağı kontrol edilir. Üste | Önceden oluşturulan denetimin IsEnabled değeri tarafından uygulanan önceki IsEnabled değeri.

IsEnabled, Bağlantının uygulandığı denetimin durumunu temsil eden ValidationRule'de (başka bir özel IsRequired DependencyProperty) en az iki özellikten yalnızca biridir. Bir DataTemplate dışında çalışırken (IE: The Binding örneği paylaşılmaz), bu çok iyi çalışır ve denetim durumuna bağlı olarak doğrulama mantığını yok sayar/değiştirir. Alternatiflere kapılmıyorum ama bunun (bu meseleyi bir kenara bırakarak) Valit ValidationRule'ın ve Kontrol'ün değiştirilmiş halinin zahmetsizce evrim geçirmesine izin veren çok esnek ve dinamik bir seçenek olduğunu hissediyorum. Bu aynı zamanda, her biri ValidationRule'un kontrol özelliklerinin kombinasyonlarından birini temsil eden ve DependencyPropertyDescriptor'un patladığı anda tüm bağlamayı değiştiren birkaç Bağlama oluşturma gibi diğer bariz ama çok daha çirkin seçeneklerden kaçınmamı sağladı. titreme

Herhangi bir düşünce MUCH'u takdir ediyor!

+0

Tam olarak aynı sorunu yaşadım ve bunun paylaşılmasının bağlayıcı olduğunu anlamak biraz zamanımı aldı ... Henüz sorunuz için iyi bir çözüm buldunuz mu? Teşekkürler –

+0

Bunun etrafında bulduğum tek yol, her doğrulama/etkin/gerekli senaryo için özel bir bağ oluşturmak ve denetimin durumu değiştiğinde bağlamaları değiştirmek. Bu aslında göründüğünden daha az acı veriyordu ve çözümle iyi bir başarı elde ettim. Devletlerin permütasyonu arttıkça daha az ideal hale gelir. Her bir ValidationRule (ler)/Enabled/Required kombinasyonu için bir özelleştirme örneğine gereksinim duyduğunuzda ne kadar dağınık olabileceğini hayal edebilirsiniz. Benim senaryoda sadece yaklaşık 12 özel bağlama gerekli. Daha iyi bir şey bulursan bana haber vermelisin. Şerefe! – phixed

+1

Geçmişte de bu konuyla karşı karşıya kaldım. Ayrıca, Binding örneğindeki ValidationRules ile sorunu öğrendiğimde ve DataTemplate senaryosunda yeniden kullanılmakta olan Bağlama örneğinde de şok oldum. Her bir bağlamaya genel bir ValidationRule koyan ve sonra gerçek doğrulama işini Enterprise Library doğrulaması veya başka bir şey gibi harici Doğrulama kitaplıklarına dağıtan bir çerçevemiz var. – KoenJ

cevap

1

DataTemplate tanımında x:Shared attribute kullanmanızı öneririm.

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

WPF kullandığınız için her istekte yeni bir DataTemplate örneği oluşturacaktır.