¿Hay alguna manera de escuchar los cambios de un DependencyProperty
? Quiero recibir notificaciones y realizar algunas acciones cuando el valor cambie, pero no puedo usar el enlace. Es un DependencyProperty
de otra clase.Escucha los cambios de la propiedad de dependencia
Respuesta
Si es DependencyProperty
de una clase separada, la forma más fácil es vincular un valor y escuchar los cambios en ese valor.
Si el DP es uno que está implementando en su propia clase, puede register a PropertyChangedCallback cuando crea el DependencyProperty
. Puede usar esto para escuchar los cambios de la propiedad.
Si está trabajando con una subclase, puede usar OverrideMetadata para agregar su propio PropertyChangedCallback
al DP que se llamará en lugar del original.
Según [MSDN] (http://msdn.microsoft.com/en-us/library/ms597491.aspx) y mi experiencia, _Algunas características (de los metadatos proporcionados) ... Otros, como PropertyChangedCallback, se combinan ._ Por lo tanto, su PropertyChangedCallback se llamará * además * a las devoluciones de llamada existentes, no * en lugar de *. –
enlace muerto? ¿es https://msdn.microsoft.com/library/ms745795%28v=vs.100%29.aspx ahora? –
Si ese es el caso, un truco. Puede introducir una clase estática con DependencyProperty
. Tu clase fuente también se une a ese dp y tu clase de destino también se une al DP.
Este método es, sin duda falta aquí:
DependencyPropertyDescriptor
.FromProperty(RadioButton.IsCheckedProperty, typeof(RadioButton))
.AddValueChanged(radioButton, (s,e) => { /* ... */ });
¡Tenga mucho cuidado con esto ya que fácilmente puede introducir fugas de memoria! Elimine siempre un controlador de nuevo con 'descriptor.RemoveValueChanged (...)' – CodeMonkey
vea los detalles y un enfoque alternativo (defina nueva propiedad de dependencia + enlace) en http://agsmith.wordpress.com/2008/04/07/propertydescriptor -addvaluechanged-alternative/ – Lu55
Esto funciona para WPF (que es para lo que esta pregunta es). Si aterrizas aquí buscando una solución de Windows Store, debes usar el truco vinculante. Encontré esta publicación de blog que podría ayudar: http://blogs.msdn.com/b/flaviencharlon/archive/2012/12/07/getting-change-notifications-from-any-dependency-property-in-windows-store- apps.aspx Probablemente también funciona con WPF (como se menciona en la respuesta anterior). – Gordon
Escribí esta clase de utilidad:
- Da DependencyPropertyChangedEventArgs con edad & nuevo valor.
- La fuente se almacena en una referencia débil en el enlace.
- No estoy seguro si la exposición Encuadernación & BindingExpression es una buena idea.
- Sin goteras.
using System;
using System.Collections.Concurrent;
using System.Windows;
using System.Windows.Data;
public sealed class DependencyPropertyListener : DependencyObject, IDisposable
{
private static readonly ConcurrentDictionary<DependencyProperty, PropertyPath> Cache = new ConcurrentDictionary<DependencyProperty, PropertyPath>();
private static readonly DependencyProperty ProxyProperty = DependencyProperty.Register(
"Proxy",
typeof(object),
typeof(DependencyPropertyListener),
new PropertyMetadata(null, OnSourceChanged));
private readonly Action<DependencyPropertyChangedEventArgs> onChanged;
private bool disposed;
public DependencyPropertyListener(
DependencyObject source,
DependencyProperty property,
Action<DependencyPropertyChangedEventArgs> onChanged = null)
: this(source, Cache.GetOrAdd(property, x => new PropertyPath(x)), onChanged)
{
}
public DependencyPropertyListener(
DependencyObject source,
PropertyPath property,
Action<DependencyPropertyChangedEventArgs> onChanged)
{
this.Binding = new Binding
{
Source = source,
Path = property,
Mode = BindingMode.OneWay,
};
this.BindingExpression = (BindingExpression)BindingOperations.SetBinding(this, ProxyProperty, this.Binding);
this.onChanged = onChanged;
}
public event EventHandler<DependencyPropertyChangedEventArgs> Changed;
public BindingExpression BindingExpression { get; }
public Binding Binding { get; }
public DependencyObject Source => (DependencyObject)this.Binding.Source;
public void Dispose()
{
if (this.disposed)
{
return;
}
this.disposed = true;
BindingOperations.ClearBinding(this, ProxyProperty);
}
private static void OnSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listener = (DependencyPropertyListener)d;
if (listener.disposed)
{
return;
}
listener.onChanged?.Invoke(e);
listener.OnChanged(e);
}
private void OnChanged(DependencyPropertyChangedEventArgs e)
{
this.Changed?.Invoke(this, e);
}
}
using System;
using System.Windows;
public static class Observe
{
public static IDisposable PropertyChanged(
this DependencyObject source,
DependencyProperty property,
Action<DependencyPropertyChangedEventArgs> onChanged = null)
{
return new DependencyPropertyListener(source, property, onChanged);
}
}
si el enlace es OneWay, ¿por qué está configurando UpdateSourceTrigger? – Maslow
@Maslow No hay razón, solo ruido, lo actualizaré, gracias. –
Se puede heredar el control que está tratando de escuchar, y luego tienen acceso directo a:
protected void OnPropertyChanged(string name)
No hay riesgo de pérdida de memoria.
No tenga miedo de las técnicas estándar de OO.
Existen varias formas de lograr esto. Aquí es una forma de convertir una propiedad dependiente de un observable, de tal manera que se puede suscribir a la utilización de System.Reactive:
public static class DependencyObjectExtensions
{
public static IObservable<EventArgs> Observe<T>(this T component, DependencyProperty dependencyProperty)
where T:DependencyObject
{
return Observable.Create<EventArgs>(observer =>
{
EventHandler update = (sender, args) => observer.OnNext(args);
var property = DependencyPropertyDescriptor.FromProperty(dependencyProperty, typeof(T));
property.AddValueChanged(component, update);
return Disposable.Create(() => property.RemoveValueChanged(component, update));
});
}
}
Uso
olvide depositar las suscripciones para evitar pérdidas de memoria:
public partial sealed class MyControl : UserControl, IDisposable
{
public MyControl()
{
InitializeComponent();
// this is the interesting part
var subscription = this.Observe(MyProperty)
.Subscribe(args => { /* ... */}));
// the rest of the class is infrastructure for proper disposing
Subscriptions.Add(subscription);
Dispatcher.ShutdownStarted += DispatcherOnShutdownStarted;
}
private IList<IDisposable> Subscriptions { get; } = new List<IDisposable>();
private void DispatcherOnShutdownStarted(object sender, EventArgs eventArgs)
{
Dispose();
}
Dispose(){
Dispose(true);
}
~MyClass(){
Dispose(false);
}
bool _isDisposed;
void Dispose(bool isDisposing)
{
if(_disposed) return;
foreach(var subscription in Subscriptions)
{
subscription?.Dispose();
}
_isDisposed = true;
if(isDisposing) GC.SupressFinalize(this);
}
}
- 1. Dependencia Propiedad dependiente de otra
- 2. Propiedad de dependencia en app.xaml.cs
- 3. ¿Cómo se implementa la propiedad de dependencia?
- 4. Cuál es la diferencia entre Propiedad y Propiedad de Dependencia
- 5. Dependencia Propiedad WPF
- 6. escuchar los cambios del portapapeles, verificar la propiedad?
- 7. Pros y contras de los métodos de escucha/observador para notificar cambios de modelo
- 8. Actualizando una propiedad de dependencia de otra
- 9. ¿Cómo minimizar el acoplamiento/dependencia entre los cambios físicos de DDL y los cambios de PL/SQL?
- 10. ¿Cómo hacer que 'svn log' ignore los cambios de propiedad?
- 11. WPF ReglaDeValidación con propiedad de dependencia
- 12. Agregar propiedad de dependencia al control
- 13. Limitar propiedad de dependencia adjunta en wpf
- 14. El socket de escucha UDP deja de escuchar después de cambios en la configuración de red
- 15. cómo inyectar la propiedad de dependencia utilizando Ioc Unidad
- 16. ¿Escucha de cambio de volumen?
- 17. Viendo una propiedad para cambios
- 18. comprobando los cambios de dependencia de maven snapshot en el servidor de integración continua
- 19. ¿Cómo identificar los cambios en la propiedad de la entidad EJB en @PreUpdate?
- 20. ¿Cuál es la diferencia entre una propiedad de dependencia y una propiedad adjunta en WPF?
- 21. ¿Inyección de dependencia mediante constructores o definidores de propiedad?
- 22. Requerir dependencia de otra dependencia en los módulos de nodo
- 23. Cambiar el valor de una propiedad de dependencia dentro de la PropertyChangedCallback para que DependencyProperty
- 24. WPF: ¿Qué distingue una propiedad de dependencia de una propiedad de CLR normal?
- 25. Dependencia Lista propiedad <string> de control de usuario
- 26. Confirmar solo cambios de propiedad en la raíz del repositorio, no en los archivos
- 27. Propiedad de dependencia con valor predeterminado Lanzamiento de StackOverflowException
- 28. Reentrada de propiedad de dependencia (o: ¿por qué funciona esto?)
- 29. Vinculando propiedad de dependencia personalizada al estilo personalizado de WPF
- 30. La propiedad de dependencia ObservableCollection no se actualiza cuando se elimina el elemento en la colección
¿Por qué dices que no puedes usar encuadernación? –