una tono sonido por poner personalizado notificaciones notificacion cómo como canción cancion cambiar c# .net wpf data-binding inotifypropertychanged

c# - sonido - poner mp3 tono whatsapp



¿Cambiar la notificación sin INotifyPropertyChanged?(extracto de Pro WPF en C#2010) (3)

Diría que es muy posible implementar notificaciones de cambios en su POCO sin utilizar INotifyPropertyChanged o las propiedades de dependencia, como se afirma en el libro, a menos que no tenga el sentido de la pregunta.

Si genera un evento llamado {Propertyname} cambiado desde su POCO cuando el valor de una propiedad ha cambiado, el sistema de enlace de WPF lo recogerá y actualizará los enlaces pertinentes.

Vea este pequeño programa para una demostración: es lo más simple que se me ocurre, pero creo que también debería funcionar en su caso.

XAML:

<StackPanel> <TextBlock Text="{Binding Name}" /> <Button Content="Change name" Click="changeNameClick" /> </StackPanel>

Código detrás:

public partial class Window1 : Window { private SimpleObject so = new SimpleObject(); public Window1() { InitializeComponent(); this.so = new SimpleObject(); so.Name = "Initial value"; this.DataContext = so; var t = new DispatcherTimer( TimeSpan.FromSeconds(1), DispatcherPriority.Normal, (s, e) => { this.so.Name = "Name changed at: " + DateTime.Now.ToString(); }, Dispatcher); } private void changeNameClick(object sender, RoutedEventArgs e) { this.so.Name = "New value!!"; } } public class SimpleObject { private string mName = null; public string Name { get { return mName; } set { if (mName != value) { mName = value; if (NameChanged != null) NameChanged(this, EventArgs.Empty); } } } public event EventHandler NameChanged; }

Mientras leía Pro WPF en C # 2010, el autor escribe:

"Puede crear un evento para cada propiedad. En este caso, el evento debe tener el nombre PropertyNameChanged (por ejemplo, UnitCostChanged). Depende de usted disparar el evento cuando se cambie la propiedad".

¿Alguien podría confirmar que esta característica funciona? Estaba experimentando y no puedo reproducir este comportamiento (quiero ver si esto funciona, entonces puedo experimentar con System.Reflection.Emit para crear tipos dinámicos)

EDIT: Debo aclarar que el énfasis aquí es implementar notificaciones de cambios SIN implementar INotifyPropertyChanged, ya que esto es lo que el libro está reclamando

Aquí está el POCO con el que estoy probando:

public class Employee { private string _FirstName; public string FirstName { get { return _FirstName; } set { if (_FirstName != value) { _FirstName = value; if (FirstNameChanged != null) { FirstNameChanged(this, new PropertyChangedEventArgs("FirstName")); } } } } }

Lo vinculé a un DataGrid y tengo un temporizador en segundo plano actualizando la propiedad FirstName aleatoriamente cada pocos segundos, pero el DataGrid nunca se dispara

<DataGrid x:Name="dgEmployees" ItemsSource="{Binding ElementName=mainWindow, Path=MyEmployees}"> <DataGrid.Columns> <DataGridTextColumn Header="FirstName" Binding="{Binding Path=FirstName}" /> </DataGrid.Columns> </DataGrid>

El evento FirstNameChanged siempre es nulo (pensé que el motor de enlace podría suscribirse automáticamente si lo detecta de acuerdo con la convención de nomenclatura). MyEmployees es solo una ObservableCollection

¿Alguien puede confirmar si esta característica que el autor menciona, de hecho funciona y si estoy cometiendo un error?

EDITAR: para el beneficio de cualquiera que piense que estoy malinterpretando el texto:

"Puedes usar tres enfoques para resolver este problema:

Puede hacer que cada propiedad de la clase Product sea una propiedad de dependencia utilizando la sintaxis que aprendió en el Capítulo 4. (En este caso, su clase debe derivarse de DependencyObject.) Aunque este enfoque hace que WPF haga el trabajo por usted (lo cual es bueno ), tiene más sentido en elementos: clases que tienen una apariencia visual en una ventana. No es el enfoque más natural para las clases de datos como Producto.

Puede plantear un evento para cada propiedad. En este caso, el evento debe tener el nombre PropertyNameChanged (por ejemplo, UnitCostChanged). Depende de usted disparar el evento cuando se cambie la propiedad.

Puede implementar la interfaz System.ComponentModel.INotifyPropertyChanged, que requiere un solo evento llamado PropertyChanged. A continuación, debe generar el evento PropertyChanged cada vez que cambie una propiedad e indicar qué propiedad ha cambiado proporcionando el nombre de la propiedad como una cadena. Aún depende de ti plantear este evento cuando una propiedad cambia, pero no necesitas definir un evento separado para cada propiedad ".


No, con WPF, necesita usar DependencyProperties o INotifyPropertyChanged . Para colecciones, INotifyCollectionChanged también hará el truco.