2017-07-14 2 views
1

Ich habe ein preloader Bildschirm Benutzer Steuerelement mit dynamischem Text, der an eine PreloaderContent -Eigenschaft innerhalb einer Singleton-Klasse gebunden ist. Singleton, weil ich nur eine einzelne Instanz dieser Eigenschaft haben möchte und sie leicht in meiner Anwendung ändern kann. Die Klasse ist ein Singleton, so dass ich einfach INotifyPropertyChanged in die Klasse implementieren konnte, um die Benutzeroberfläche zu aktualisieren, wenn sich der Eigenschaftswert ändert.WPF-Text Bindung an nicht statische Eigenschaft in Singleton-Klasse?

Diese Bindungsmethode spiegelt den ursprünglichen Eigenschaftswert wider. Jedes Mal, wenn ich die Eigenschaft, über den Zugriff auf die einzelne Instanz zu ändern, wird die Änderung nicht reflektiert ..

   <TextBlock Panel.ZIndex="100" Margin="0" TextWrapping="Wrap" Text="{Binding PreloaderContent, Source={x:Static models:Loader.LoaderManager}}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="21" FontWeight="Bold" Foreground="#FFF"> 

Preloader Singleton

{ 
    //TO-DO: Make this a singleton class to implement iNotifyPropertyChanged 
    //TO-DO: Also, potentially move this into a different directory? 
    public class Loader : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     private static Loader _LoaderManager = new Loader(); 
     public static Loader LoaderManager 
     { 
      get { return _LoaderManager; } 
     } 
     // Visbility parameter to determine visbility of custom preloader user control 
     private Visibility _preloader; 
     public Visibility Preloader 
     { 
      get 
      { 
       return _preloader; 
      } 
      set 
      { 
       _preloader = value; 
       if (_preloader != value) 
       { 
        _preloader = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

     // Textual content showing preloader message inside preloader user control 
     private string _preloaderContent; 
     public string PreloaderContent { 
      get 
      { 
       return _preloaderContent; 
      } 
      set 
      { 
       _preloaderContent = value; 
       if (_preloaderContent != value) 
       { 
        _preloaderContent = value; 
        NotifyPropertyChanged(); 
       } 
      } 
     } 

    } 
} 

XAML-Code

Nun, ich möchte die Text="" binden zur Eigenschaft von PreloaderContent (die in einer anderen Klasse existiert, nicht im Viewmodel), aber ich habe Probleme, die Änderungen in der Benutzeroberfläche zu spiegeln, wenn sich der Wert ändert.

<Grid> 
    <Border Panel.ZIndex="1000" d:IsHidden="True" Background="#80000000" Margin="0,0,0,-0.4"> 
     <Grid> 
      <TextBlock Panel.ZIndex="100" Margin="0" TextWrapping="Wrap" Text="" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="21" FontWeight="Bold" Foreground="#FFF"> 
      </TextBlock> 
      <TextBlock Panel.ZIndex="100" Margin="11,136,12,75.2" TextWrapping="Wrap" Text="Please Wait..." HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14" FontWeight="Bold" Foreground="#FFF"/> 
     </Grid> 
    </Border> 

Antwort

0

Entweder die andere Klasse muss auch statisch, oder Ihre Loader-Klasse muss eine Eigenschaft hat, dass die andere Klasse festlegen kann, welcher in dem Textfeld reflektiert wird.

+0

Wenn Sie „andere Klasse“, sagen beziehen Sie sich auf das Ansichtsmodell, das mit der Ansicht verknüpft ist, der die Benutzersteuerung UI-Elemente angezeigt wird? – ryan

0

Rookie Fehler. Ich war das Überschreiben des preloader Wertes in meinem Content-Setter

_preloader = value; 
Verwandte Themen