2012-04-25 9 views
5

Szukam rozwiązania i/lub racjonalności kryjącej się za tym, dlaczego instancja Binding jest współużytkowana w DataTemplate. To ostatecznie sprowadza się do faktu, że w DataTemplate, nie ma żadnego sposobu na wymuszenie nowej instancji wiązania na zależności zależnej dla każdego wygenerowanego sterowania. Prawdopodobnie jest to uczciwe i dobre założenie we wszystkich przypadkach, z wyjątkiem sytuacji, gdy istnieją ValidationRules reprezentujące coś konkretnego na temat wystąpienia tej kontroli.Instancje wiążące są ponownie używane w DataTemplates, gdy nie można udostępnić ValidationRules.

Aby opracować (mogę podać kod, ale nie uważam, że jest to konieczne), używam DependencyPropertyDescriptor na IsEnabled, aby zaktualizować jeden lub więcej ValidationRules, które należą do wiązania TextBox.Text, DatePicker.Text Binding lub ComboBox.SelectedValue Binding, itp. Pomysł polega na tym, że walidacja będzie inna lub niepożądana, gdy kontrola nie zostanie włączona.

Z tego powodu stan ValidationRule IsEnabled jest specyficzny dla indywidualnej kontroli, a ponieważ kolekcja ValidationRule jest częścią powiązania, a instancja Binding jest udostępniana - każda kontrolka, która kończy udostępnianie tego wiązania, zaktualizuje/zastąpi poprzednia wartość IsEnabled, która została zastosowana przez wartość IsEnabled wcześniej wygenerowanego formantu.

IsEnabled jest tylko jedną z co najmniej dwóch właściwości w ValidationRule (inna niestandardowa właściwość RelendencyProperty), która reprezentuje stan formantu, do którego stosowane jest powiązanie. Podczas pracy poza DataTemplate (instancja IE: The Binding nie jest udostępniana), działa to bardzo dobrze i ignoruje/zmienia logikę walidacji opartą na stanie kontrolki. Nie zamykam się na alternatywy, ale czuję, że to (poza tym problemem) bardzo elastyczna i dynamiczna opcja, która pozwala instancji Binding instancji ValidationRule i zmienionemu przez kontrolę stanu Reguł, aby ewoluować bez wysiłku. Pozwoliło mi to również uniknąć innych oczywistych, ale znacznie brzydszych opcji, takich jak tworzenie wielu powiązań, z których każda reprezentuje jedną z kombinacji właściwości kontrolnych ValidationRule i przełączanie całego wiązania w momencie uruchomienia DependencyPropertyDescriptor. dreszcze

Wszelkie myśli są DUŻE doceniane!

+0

Miałem dokładnie ten sam problem i zajęło mi trochę czasu, aby ustalić, czy wiązanie zostało udostępnione ... Czy znalazłeś już jakieś dobre rozwiązanie na swoje pytanie? Dzięki –

+0

Jedynym sposobem znalezienia wokół tego było utworzenie niestandardowego powiązania dla każdego scenariusza sprawdzania poprawności/włączonego/wymaganego, a także wymiany powiązań po zmianie stanu kontrolki. To było mniej bolesne niż się wydawało i odniosłem sukces z rozwiązaniem. Po prostu staje się mniej idealna, gdy wzrasta permutacja stanów. Możesz sobie wyobrazić, jak niechlujny może być wtedy, gdy potrzebujesz niestandardowej instancji powiązania dla każdej kombinacji ValidationRule (s)/Enabled/Required. Mój scenariusz wymagał tylko około 12 niestandardowych powiązań. Będziesz musiał dać mi znać, jeśli znajdziesz coś lepszego. Twoje zdrowie! – phixed

+1

W przeszłości miałem do czynienia z tym problemem. Byłem również w szoku, gdy dowiedziałem się o problemie z ValidationRules w instancji Binding, a Instancja Binding była ponownie używana w scenariuszu DataTemplate. Mamy framework, który umieszcza ogólną ValidationRule na każdym wiązaniu, a następnie deleguje faktyczne prace walidacyjne do zewnętrznych bibliotek sprawdzania poprawności, takich jak sprawdzanie biblioteki Enterprise lub cokolwiek innego. – KoenJ

Odpowiedz

1

Proponuję użyć x:Shared attribute w definicji DataTemplate.

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

Od momentu użycia WPF utworzy nową instancję DataTemplate na każde żądanie.

Powiązane problemy