Tenía una variable que no era estática e INotifyPropertyChanged se implementó con éxito. Luego traté de hacerlo global, así que lo convertí en una variable estática. Pero esta vez, INotifyPropertyChanged no funciona. ¿Alguna solución?INotifyPropertyChanged para la variable estática
Respuesta
INotifyPropertyChanged
funciona en propiedades de instancia. Una solución es usar un patrón singleton y mantener INotifyPropertyChanged
, la otra es usar su propio evento para notificar a los oyentes.
Singleton ejemplo
public sealed class MyClass: INotifyPropertyChanged
{
private static readonly MyClass instance = new MyClass();
private MyClass() {}
public static MyClass Instance
{
get
{
return instance;
}
}
// notifying property
private string privMyProp;
public string MyProp
{
get { return this.privMyProp; }
set
{
if (value != this.privMyProp)
{
this.privMyProp = value;
NotifyPropertyChanged("MyProp");
}
}
}
// INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(info));
}
}
}
EDITAR: En WPF 4.5, introdujeron propiedad cambió mecánico de las propiedades estáticas:
puede utilizar las propiedades estáticas como la fuente de un enlace de datos. El motor de enlace de datos reconoce cuándo cambia el valor de la propiedad si se produce un evento estático . Por ejemplo, si la clase SomeClass define una propiedad estática llamada MyProperty, SomeClass puede definir un evento estático que se genera cuando cambia el valor de MyProperty. El evento estático puede usar cualquiera de las siguientes firmas.
public static event EventHandler MyPropertyChanged;
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
+1 para sugerencia singleton –
¿Un pequeño ejemplo? – Shibli
@Shilbi ¿Un pequeño ejemplo de qué? – chopikadze
muy buen ejemplo, que la utilizó para algunos ajustes generales de aplicación, cuando quiero obligar a alguna propiedad en línea a los componentes
public sealed class DataGridClass:INotifyPropertyChanged
{
private static readonly DataGridClass instance = new DataGridClass();
private DataGridClass() { }
public static DataGridClass Instance
{
get
{
return instance;
}
}
private int _DataGridFontSize {get;set;}
public int DataGridFontSize
{
get { return _DataGridFontSize; }
set { _DataGridFontSize = value;
RaisePropertyChanged("DataGridFontSize");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
Establecer propiedades de inicio:
DataGridClass.Instance.DataGridFontSize = 14(or read from xml)
Enlace esto a propiedades de componentes
xmlns:static="clr-namespace:MyProject.Static"
<extgrid:ExtendedDataGrid x:Name="testGrid" ClipboardCopyMode="IncludeHeader" AutoGenerateColumns="False">
<extgrid:ExtendedDataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="FontSize"
Value="{Binding Source={x:Static static:DataGridClass.Instance},
Path=DataGridFontSize, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/>
</Style>
</extgrid:ExtendedDataGrid.Resources>
Cuando se cambia este valor en algún lugar de aplicación como "Preferencias" -> DataGrid Tamaño de Letra - a una actualización automática esta propiedad para los enlaces con UpdateSourceTrigger
private void comboBoxFontSize_DropDownClosed(object sender, EventArgs e)
{
DataGridClass.Instance.DataGridFontSize = Convert.ToInt32(comboBoxFontSize.Text);
}
<ComboBox Grid.Column="1" Grid.Row="0" Height="21" Width="75" Name="comboBoxFontSize" HorizontalAlignment="Left"
VerticalAlignment="Center" DropDownClosed="comboBoxFontSize_DropDownClosed"
ItemsSource="{Binding Source={x:Static commands:ConstClass.ListOfFontSize},Mode=OneWay}"
SelectedItem="{Binding Source={x:Static static:DataGridClass.Instance},Path=DataGridFontSize,
Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/>
Muchas gracias por este ejemplo, es exactamente lo que necesitaba. ¡Funciona un regalo! – RobHurd
- 1. variable estática global vs variable estática en la función?
- 2. INotifyPropertyChanged en la subclase
- 3. Interferencia estática variable ASP.net?
- 4. Variable estática de plantilla
- 5. ¿Inicialización de variable estática?
- 6. C++ variable estática
- 7. C# usando la variable estática como parámetro para DeploymentItem
- 8. ¿Cómo se asigna la memoria para una variable estática?
- 9. Función recursiva con la variable estática
- 10. La variable estática pierde el valor
- 11. Variable global estática y variable local estática en la función del controlador
- 12. C++ Referencia indefinida a la variable estática
- 13. Heredar variable estática de la clase abstracta
- 14. Público valor de la variable estática
- 15. variable estática frente a miembro
- 16. una variable estática en c
- 17. Herencia variable estática en Python
- 18. inicialización de variable estática java
- 19. variable estática final en Java
- 20. INotifyPropertyChanged problema
- 21. función no estática frente a función estática y variable
- 22. Posible inicializar la variable estática llamando a la función
- 23. Cant obtener la variable estática de la clase $
- 24. Python API C++: "Variable estática" para un Objeto Type
- 25. Usando una variable estática para almacenar en caché los datos
- 26. ¿Debo sincronizar una variable volátil estática?
- 27. Completando dinámicamente una variable estática en PHP
- 28. Recolector de basura y clase estática, variable
- 29. inicializando una variable estática en el encabezado
- 30. Objetivo C: variable estática y global?
posible duplicado de [Encuadernación a la propiedad estática] (http://stackoverflow.com/questions/936304/binding-to-static-property) –