2011-06-17 16 views
6

Aplikacja została opracowana przy użyciu C# i WPF. Mam powiązanie danych z właściwością statyczną klasy nie statycznej. Po uruchomieniu aplikacji powiązanie działa dobrze, ale jeśli zmienię ustawienie wiązania, widok nie zostanie zaktualizowany. Jak mogę zaktualizować powiązanie tej właściwości statycznej? Powiadomienia - zdarzenia nie mają wpływu.Aktualizacja wiązania właściwości statycznej

Klasa:

public class ViewTemplateManager : NotifyBase 
{ 
    public static bool CanResizeColumns { get; set; } 

    static ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 

Widok:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static Member=viewManager:ViewTemplateManager.CanResizeColumns}}" 
+0

Nie rozumiem dlaczego ta klasa jest statyczna. Możesz użyć dziedziczenia lub kompilacji, aby połączyć to z klasą podstawową swojego viewmodelu. Jeśli to zrobisz, będziesz mieć tę CanResizeColumns jako właściwość w swoim viewmodelu iz powodzeniem użyć OnPropertyChanged ("PropertyName")? –

Odpowiedz

6

Jedynym sposobem wykonania tej czynności jest odniesienie do powiązanej BindingExpression.

Zakładając, że odniesienie do kciukiem w kodzie, to będzie wyglądać:

var bindingExpression = thumb.GetBindingExpression(Thumb.IsEnabledProperty); 
if (bindingExpression != null) 
    bindingExpression.UpdateTarget(); 

Najprościej byłoby użyć Singleton, tak:

public class ViewTemplateManager : NotifyBase 
{ 
    public bool CanResizeColumns { get; set; } 

    public static ViewTemplateManager Instance { get; private set; } 

    static ViewTemplateManager() 
    { 
     Instance = new ViewTemplateManager(); 
    } 

    private ViewTemplateManager() 
    { 
     CanResizeColumns = true; 
    } 
} 

Następnie wiĘ ... ź się tak:

<Thumb x:Name="PART_HeaderGripper" IsEnabled="{Binding Source={x:Static viewManager:ViewTemplateManager.Instance}, Path=CanResizeColumns}}" 

Po prostu musisz podnieść zdarzenie INotifyPropertyChanged.PropertyChanged, gdy yo zmień CanResizeColumns.

+0

Działa dobrze z Singleton Pattern! – Gepro

2

Niestety, nie ma bezpośredniego odpowiednika na mechanizm powiadamiania o INotifyPropertyChanged dotyczącego własności statyczne.

Istnieje kilka opcji, w tym:

  1. Złóż właściwość level instancja, która zwraca element statyczny. Użyj niestandardowego mechanizmu, aby powiadomić instancje o zmianie, kiedy instancja może podnieść zdarzenie PropertyChanged. To może stać się brzydkie i wprowadzić wycieki pamięci, jeśli nie jesteś ostrożny, aby anulować subskrypcję lub używać słabego wzorca zdarzeń.
  2. Przenieś właściwość statyczną na singleton i umieść ją jako element instancji w instancji singleton. Dzięki temu ta instancja może normalnie podnosić zdarzenia PropertyChanged.
+0

Istnieje 'StaticPropertyChanged' – Wobbles

+0

@wobbles został dodany po tej odpowiedzi –

2

Można też wdrożyć właściwości używając Singleton na którym nieruchomość nie jest statyczna lub po prostu także sprawiają, że non-static, ale po prostu utworzyć jedną instancję w instancji App na przykład (pójdę z nią). W obu przypadkach możesz ponownie wdrożyć INotifyPropertyChanged.

0

myślę, że to jest łatwiejsze rozwiązanie: nieruchomość

Klasa:

private static bool isEnabled; //there is Your static 

public bool IsEnabled 
{ 
    get { return isEnabled; } 
    set 
    { 
     isEnabled = value; 
     RaisePropertyChanged("IsEnabled"); //OnPropertyChanged or something 
    } 
} 

XAML:

<Button IsEnabled="{Binding IsEnabled}"/> 
Powiązane problemy