¿Alguien sabe cómo determinar si el valor de una propiedad WPF se hereda? En particular, estoy tratando de determinar si el DataContext
de un FrameworkElement
se heredó del elemento principal o se configuró directamente en el elemento en sí.Determine si se hereda un valor WPF DependencyProperty
Respuesta
actualiza después de cavar más
Hay un método que se ReadLocalValue
estúpidamente Leer en lugar de Obtener tan difícil de detectar en IntelliSense. (Creo que el libro WPF de Apress tenía una nota sobre esto en realidad.) Devolverá UnsetValue si el valor no se ha establecido.
if (ReadLocalValue(Control.DataContextProperty) !=
DependencyProperty.UnsetValue)
{
// Data context was set locally.
}
Si por alguna razón necesita para obtener todos los propiedades establecidas a nivel local, puede utilizar LocalValueEnumerator.
LocalValueEnumerator enumerator = GetLocalValueEnumerator();
while (enumerator.MoveNext())
{
if (enumerator.Current.Property == Control.DataContextProperty)
{
// DataContext was set locally
}
}
Y estos dos métodos realmente me hacen maravilla. Lea en lugar de Obtener en ReadLocalValue y una colección que no puede repetir con foreach en GetLocalValueEnumerator. Es como .Net tiene estos buenos elementos estándar que el equipo de WPF simplemente decidió ignorar.
DependencyPropertyHelper.GetValueSource
le dará una ValueSource
, que incluye una propiedad para recuperar el BaseValueSource
. La enumeración BaseValueSource
le indica dónde obtiene su valor el DependencyProperty
, como el heredado de uno de los padres, configurado a través de un estilo o configurado localmente.
un enumerador es estándar, simplemente no proporcionan una colección que utiliza ese enumerador como resultado de su método GetEnumerator (que es lo que hace que For Each funcione). también, desde mi experiencia, generalmente es más fácil escribir algoritmos jerárquicos en términos de enumeradores en lugar de colecciones, por lo que no me sorprende que no proporcionen esto.
- 1. WPF Enlace a variable/DependencyProperty
- 2. WPF personalizado DependencyProperty notify changes
- 3. Determine si se usa una celda (valor) en cualquier fórmula
- 4. Determine si una cadena es un valor flotante válido
- 5. WPF Control personalizado: DependencyProperty de tipo Colección
- 6. Determine si existe un recurso en ResourceManager
- 7. Determine si se ha modificado un archivo abierto en C
- 8. Determine si un evento se ha adjuntado aún
- 9. En WPF do DependencyProperty causa un montón de boxeo/unboxing cuando se usa con tipos de valor?
- 10. Exponer DependencyProperty
- 11. Flex: determine si un componente muestra
- 12. Determine si un tipo es estático
- 13. Determine si un carácter es alfabético
- 14. DependencyProperty and DataBinding?
- 15. Determine si NSNumber es NaN
- 16. DependencyProperty ValidateValueCallback pregunta
- 17. Determine quién tiene foco en WPF Ventana
- 18. ASP.NET MVC ActionFilter - Determine si AJAX Request
- 19. Mongoid, alcance si se establece un valor?
- 20. Script Bash: determine si se modificó el archivo.
- 21. Enlazar una DependencyProperty de solo lectura a otra propiedad DependencyProperty
- 22. C# VS2010 Determine en la aplicación si se depuró
- 23. Determine si se utilizan conjuntos GAC'ed y NGen'ed
- 24. Determine si la aplicación se ejecuta en azul o no
- 25. Ruby: determine si un número es un número primo
- 26. Determine si un byte [] es un archivo pdf
- 27. Determine cuándo se lanzará un ScheduledExecutorService siguiente
- 28. DependencyProperty of Type Delegate
- 29. Escucha DependencyProperty evento modificado y obtener el valor antiguo
- 30. Determine si la aplicación actual está activada (tiene foco)
Estaba usando 'ReadLocalValue' antes para determinar si se estableció un valor en un' Panel' personalizado. Esto condujo a un comportamiento realmente extraño en el que cuando un estilo aplicaba un valor, mi panel aún creía que el valor no estaba establecido. Solo cuando se llamaba a 'SetValue', el panel comenzaba a delinear mis elementos de la forma en que se suponía que debían, aunque' GetValue' devolvió los valores correctamente. La forma correcta de hacerlo es según [la respuesta de Kent] (http://stackoverflow.com/a/809480/590790), que le proporciona toda la información, en lugar de solo el efecto secundario (valor local). –