2016-12-30 2 views
0

alle.C# Bindende globale statische Zeichenfolge an UWP Textblock

Weiß jemand, wie man globale statische Zeichenkette an UWP Textblock bindet, wenn Propertychange in Kontrolle ist?

Ich habe eine Menge Dinge ausprobiert, wie zum Beispiel:

Text="{Binding Path={local:AppSettings.StorageFolder}, Mode=OneWay}" 
Text="{x:Bind Path=(local:AppSettings.StorageFolder), RelativeSource={RelativeSource Self}, Mode=OneWay}" 

Und keiner arbeitet. Kommt immer einige Fehler auf, wie: „Nested-Typen werden nicht unterstützt und Wert nicht innerhalb des erwarteten Bereichs“

ich es geschafft habe es nicht statischen Wert in meiner Klasse zu binden:

Text="{x:Bind viewModel.MyValue, Mode=OneWay}" 

Irgendeine Lösung zu diesem?

Danke.

+0

Ich empfehle dringend, statische Variablen so weit wie möglich loszuwerden. –

+0

Was ist der beste Weg, um globale Variablen, wie Anwendungseinstellungen, auf jeder Seite zu sehen, und kann geändert werden? – user3239349

+0

Es gibt keine spezielle "beste" Möglichkeit, dies zu tun, während globale/statische Variablen am schlechtesten sind. –

Antwort

0

Sie können einfach nicht an eine statische Eigenschaft in UWP genauso wie in WPF binden. Es gibt keine X: Statische Markup-Erweiterung verfügbar.

Sie haben einige Optionen:

Wenn das Datacontext des Elements eine Instanz des Typs, in dem die statische Eigenschaft definiert ist, können Sie auf eine statische Eigenschaft wie üblich binden könnte:

<TextBlock Text="{Binding MyStaticProperty}" /> 

public sealed partial class BlankPage1 : Page 
{ 
    public BlankPage1() 
    { 
     this.InitializeComponent(); 
     this.DataContext = this; 
    } 

    public static string MyStaticProperty { get { return "Static..."; } } 
} 

wenn die statische Eigenschaft in einer anderen Klasse definiert ist, die beste Option wäre, die statische Eigenschaft in einem nicht-statisch zu wickeln:

public sealed partial class BlankPage1 : Page 
{ 
    public BlankPage1() 
    { 
     this.InitializeComponent(); 
     this.DataContext = this; 
    } 

    public static string MyWrapperProperty { get { return MyStaticClass.MyStaticProperty; } } 
} 

public static class MyStaticClass 
{ 
    public static string MyStaticProperty { get { return "Static..."; } } 
} 

wenn Sie Eigenschaft chang wollen Bei Benachrichtigungen ist es nicht sinnvoll, an eine statische Eigenschaft zu binden, da das Quellobjekt einer Eigenschaft die INotifyPropertyChanged-Schnittstelle implementieren muss, damit Sie die Zieleigenschaft dynamisch aktualisieren können, indem Sie das PropertyChanged-Ereignis auslösen.

Sie könnten immer noch die statische Eigenschaft in einem nicht-statische einer Ansicht Modell wickeln, die den INotifyPropertyChanged-Schnittstelle implementiert:

public class ViewModel : INotifyPropertyChanged 
{ 
    public string MyNonStaticProperty 
    { 
     get { return MyStaticClass.MyStaticProperty; } 
     set { MyStaticClass.MyStaticProperty = value; NotifyPropertyChanged(); } 
    } 

    //... 
} 

public static class MyStaticClass 
{ 
    public static string MyStaticProperty { get; set; } 
} 

Sie obviosuly NotifyPropertyChanged („MyNonStaticProperty“) aus dem View-Modell müssen nennen Klasse, wenn Sie die Zieleigenschaft in der Ansicht aktualisieren möchten.

+0

Danke, statische Aktualisierung über nicht statische Klasse löste mein Problem. – user3239349

Verwandte Themen