Estoy buscando una solución y/o la racionalidad detrás de por qué una instancia de enlace se comparte dentro de un DataTemplate. En última instancia, esto se debe al hecho de que dentro de un DataTemplate, aparentemente no hay forma de forzar una nueva instancia de un enlace en una DependencyProperty para cada control generado. Esa es probablemente una suposición justa y buena en todos los casos excepto cuando hay ValidationRules que representan algo específico sobre la instancia de ese control.Instancias de enlace reutilizadas en DataTemplates cuando ValidationRules no se pueden compartir
Para elaborar (puedo proporcionar código, pero no creo que sea necesario), utilizo DependencyPropertyDescriptor en IsEnabled para actualizar una o más ValidationRules que pertenecen a un TextBox.Text Binding, DatePicker.Text Binding, o un ComboBox.SelectedValue Binding, etc. La idea es que la validación será diferente o no deseada cuando un control no está habilitado.
Debido a esto, el estado de IsEnabled de la ValidationRule es específico para el control individual y porque ValidationRule Collection forma parte del enlace y la instancia de enlace se comparte; cada control que termine compartiendo ese enlace se actualizará/sustituirá el valor IsEnabled anterior que fue aplicado por el valor IsEnabled del control generado previamente.
IsEnabled es solo una de al menos dos propiedades en ValidationRule (otra propiedad Dependency de IsRequired personalizada) que representa el estado del control al que se aplica la vinculación. Cuando se trabaja fuera de un DataTemplate (IE: la instancia de enlace no se comparte), esto funciona muy bien e ignora/altera la lógica de validación en función del estado del control. No estoy cerrado a las alternativas, pero creo que esto ha sido (esta cuestión a un lado) una opción muy flexible y dinámica que permite que la instancia de enlace ValidationRule y el estado de cambio de control de las Reglas evolucionen sin esfuerzo. Esto también me ha permitido evitar otras opciones obvias pero mucho más feas como crear varios enlaces, cada uno representando una de las combinaciones de las propiedades de control de ValidationRule y desconectando todo el enlace en el momento en que se dispara DependencyPropertyDescriptor. escalofríos
¡Cualquier pensamiento es MUCHO apreciado!
Tuve exactamente el mismo problema, y me tomó un tiempo darme cuenta de que era el enlace compartido ... ¿Has encontrado alguna buena solución para tu pregunta? Gracias –
La única forma en que encontré esto fue crear un enlace personalizado para cada escenario de validación/habilitado/requerido, y cambiar los enlaces cuando cambió el estado del control. En realidad, fue menos doloroso de lo que parece y he tenido mucho éxito con la solución. Simplemente se vuelve menos ideal a medida que aumenta la permutación de los estados. Puede imaginarse lo desordenado que podría ser cuando necesite una instancia personalizada de un enlace para cada combinación de Regla de Validación/Habilitado/Obligatorio. Mi escenario requería solo alrededor de 12 enlaces personalizados. Tendrás que avisarme si encuentras algo mejor. ¡Aclamaciones! – phixed
Me he enfrentado con este problema en el pasado también. También me sorprendió cuando descubrí el problema con ValidationRules en la instancia de enlace, y la instancia de enlace se volvió a utilizar en un escenario de DataTemplate. Tenemos un marco que pone un ValidationRule genérico en cada enlace, y luego delega el trabajo de validación real a bibliotecas de validación como la validación de Enterprise Library o cualquier otra cosa. – KoenJ