propertychangedeventargs onpropertychanged ejemplo wpf xaml data-binding

wpf - ejemplo - onpropertychanged c#



¿Por qué la actualización de enlace sin implementar INotifyPropertyChanged? (3)

Creé un ViewModel y vinculé su propiedad a dos cuadros de texto en la interfaz de usuario. El valor del otro cuadro de texto cambia cuando cambio el valor de primero y me enfoco en el cuadro de texto, pero no estoy implementando INotifyPropertyChanged. ¿Cómo está funcionando?

Lo siguiente es XAML

<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <local:ViewModel /> </Window.DataContext> <StackPanel> <TextBox Text="{Binding Name}" /> <TextBox Text="{Binding Name}" /> </StackPanel> </Window>

Y a continuación está mi ViewModel

class ViewModel { public string Name { get; set; } }


Acabo de descubrir que esto también funciona en WinForms, un poco: /

public class Test { public bool IsEnabled { get; set; } } var test = new Test(); var btn = new Button { Enabled = false, Text = "Button" }; var binding = new Binding("Enabled", test, "IsEnabled"); btn.DataBindings.Add(binding); var frm = new Form(); frm.Controls.Add(btn); test.IsEnabled = true; Application.Run(frm);

Curiosamente, esto no desactiva el botón:

btn.Enabled = false;

Esto hace:

test.IsEnabled = false;


Lo probé, tienes razón. Ahora lo busqué en la web, y encontré this .

Lamento tardar tanto en responder, en realidad se encuentra con otro aspecto oculto de WPF , el motor de enlace de datos de WPF enlazará los datos a la instancia PropertyDescriptor que envuelve la propiedad fuente si el objeto fuente es un objeto CLR simple y no implementa Interfaz INotifyPropertyChanged . Y el motor de enlace de datos intentará suscribirse al evento de propiedad modificada a través del método PropertyDescriptor.AddValueChanged (). Y cuando el elemento enlazado de datos de destino cambia los valores de las propiedades, el motor de enlace de datos llamará al método PropertyDescriptor.SetValue () para transferir el valor cambiado a la propiedad de origen, y simultáneamente generará un evento ValueChanged para notificar a otros suscriptores (en este caso, los otros suscriptores serán los TextBlocks dentro del ListBox.

Y si está implementando INotifyPropertyChanged, usted es totalmente responsable de implementar la notificación de cambio en cada setter de las propiedades que deben estar vinculadas a la interfaz de usuario. De lo contrario, el cambio no se sincronizará como era de esperar.

Espero que esto aclare un poco las cosas.

Entonces, básicamente, puedes hacer esto, siempre que sea un objeto CLR simple. Bastante limpio pero totalmente inesperado, y he trabajado un poco en WPF en los últimos años. Nunca dejas de aprender cosas nuevas, ¿verdad?

Como lo sugirió Hasan Khan, aquí hay otro enlace a un artículo bastante interesante sobre este tema.

Tenga en cuenta que esto solo funciona cuando se usa el enlace . Si actualiza los valores del código , no se notificará el cambio. [...]

WPF usa la clase PropertyInfo mucho más liviana cuando se vincula. Si implementa explícitamente INotifyPropertyChanged, todo lo que WPF necesita hacer es llamar al método PropertyInfo.GetValue para obtener el último valor. Eso es bastante menos trabajo que obtener todos los descriptores. Los descriptores terminan costando en el orden de 4x la memoria de las clases de información de propiedad. [...]

La implementación de INotifyPropertyChanged puede ser un poco tedioso de trabajo de desarrollo. Sin embargo, deberá ponderar ese trabajo con el espacio de tiempo de ejecución (memoria y CPU) de su aplicación WPF. La implementación de INPC usted mismo guardará la CPU y la memoria del tiempo de ejecución .


Puedo explicar por qué la propiedad se actualiza cuando cambia el foco: todos los UpdateSourceTrigger tienen una propiedad UpdateSourceTrigger que indica cuándo se actualizará la propiedad de origen. El valor predeterminado para esto se define en cada DependencyProperty y para la propiedad TextBox.Text se establece en LostFocus , lo que significa que la propiedad se actualizará cuando el control pierda el foco.

Creo que la respuesta de UrbanEsc explica por qué el valor se actualiza en absoluto