Associazione a proprietà statiche

Ho difficoltà a bind una semplice proprietà di stringa statica a una casella di testo.

Ecco la class con la proprietà statica:

public class VersionManager { private static string filterString; public static string FilterString { get { return filterString; } set { filterString = value; } } } 

Nel mio xaml, voglio solo associare questa proprietà statica a una casella di testo:

      

Tutto viene compilato, ma in fase di esecuzione, ottengo la seguente eccezione:

Imansible convertire il valore nell’attributo ‘Origine’ nell’object di tipo ‘System.Windows.Markup.StaticExtension’. Errore nell’object ‘System.Windows.Data.Binding’ nel file di markup ‘BurnDisk; component / selectversionpagefunction.xaml’ Line 57 Position 29.

Qualche idea su cosa sto facendo male?

Se l’associazione deve essere bidirezionale, devi fornire un percorso. C’è un trucco per eseguire il bind a doppio senso su una proprietà statica, a condizione che la class non sia statica: dichiarare un’istanza fittizia della class nelle risorse e usarla come origine del bind.

    ...  

Non puoi bind a una statica del genere. L’infrastruttura di INotifyPropertyChanged grado di ricevere notifiche degli aggiornamenti poiché non è coinvolto DependencyObject (o istanza di object che implementa INotifyPropertyChanged ).

Se quel valore non cambia, basta eliminare il binding e usare x:Static direttamente all’interno della proprietà Text . Definisci l’ app basso come ubicazione namespace (e assembly) della class VersionManager.

  

Se il valore cambia, suggerirei di creare un singleton per contenere il valore e associarlo.

Un esempio del singleton:

 public class VersionManager : DependencyObject { public static readonly DependencyProperty FilterStringProperty = DependencyProperty.Register( "FilterString", typeof( string ), typeof( VersionManager ), new UIPropertyMetadata( "no version!" ) ); public string FilterString { get { return (string) GetValue( FilterStringProperty ); } set { SetValue( FilterStringProperty, value ); } } public static VersionManager Instance { get; private set; } static VersionManager() { Instance = new VersionManager(); } } 
  

In .NET 4.5 è ansible associare proprietà statiche, maggiori informazioni

È ansible utilizzare le proprietà statiche come origine di un’associazione dati. Il motore di associazione dati riconosce quando il valore della proprietà cambia se viene generato un evento statico. Ad esempio, se la class SomeClass definisce una proprietà statica denominata MyProperty, SomeClass può definire un evento statico che viene generato quando il valore di MyProperty cambia. L’evento statico può utilizzare una delle seguenti firme:

 public static event EventHandler MyPropertyChanged; public static event EventHandler StaticPropertyChanged; 

Si noti che nel primo caso, la class espone un evento statico denominato PropertyNameChanged che passa EventArgs al gestore eventi. Nel secondo caso, la class espone un evento statico denominato StaticPropertyChanged che passa PropertyChangedEventArgs al gestore eventi. Una class che implementa la proprietà statica può scegliere di generare notifiche di modifica delle proprietà utilizzando uno dei due metodi.

È ansible utilizzare la class ObjectDataProvider e la proprietà ObjectDataProvider . Può assomigliare a questo:

    

Il provider di dati object dichiarato può essere utilizzato in questo modo:

  

A partire da WPF 4.5 è ansible associare direttamente alle proprietà statiche e fare in modo che l’associazione si aggiorni automaticamente quando si modifica la proprietà. È necessario cablare manualmente un evento di modifica per triggersre gli aggiornamenti di associazione.

 public class VersionManager { private static String _filterString; ///  /// A static property which you'd like to bind to ///  public static String FilterString { get { return _filterString; } set { _filterString = value; // Raise a change event OnFilterStringChanged(EventArgs.Empty); } } // Declare a static event representing changes to your static property public static event EventHandler FilterStringChanged; // Raise the change event through this static method protected static void OnFilterStringChanged(EventArgs e) { EventHandler handler = FilterStringChanged; if (handler != null) { handler(null, e); } } static VersionManager() { // Set up an empty event handler FilterStringChanged += (sender, e) => { return; }; } } 

Ora puoi associare la proprietà statica come qualsiasi altra:

  

Se stai utilizzando risorse locali puoi fare riferimento ad esse come di seguito:

  

Ci potrebbero essere due modi / syntax per associare una proprietà static . Se p è una proprietà static in MainWindow class, il binding per la textbox di textbox sarà:

1.

  

2.

  

Guarda il mio progetto CalcBinding , che ti fornisce la scrittura di espressioni complesse nel valore della proprietà Path, incluse proprietà statiche, proprietà sorgente, Math e altro. Quindi, puoi scrivere questo:

  

In bocca al lupo!

Variante giusta per .NET 4.5 +

Codice C #

 public class VersionManager { private static string filterString; public static string FilterString { get { return filterString; } set { if (filterString == value) { return; } filterString = value; var evnt = StaticPropertyChanged; if (evnt != null) { evnt(null,FilterStringPropertyEventArgs); } } } private static readonly PropertyChangedEventArgs FilterStringPropertyEventArgs = new PropertyChangedEventArgs (nameof(FilterString)); public static event EventHandler StaticPropertyChanged; } 

Associazione XAML (attenzione alle parentesi che sono (), non {})