Trudno mi jest powiązać prostą statyczną właściwość ciągu z TextBox.
Oto klasa z właściwością statyczną:
public class VersionManager
{
private static string filterString;
public static string FilterString
{
get { return filterString; }
set { filterString = value; }
}
}
W moim XAML chcę po prostu powiązać tę statyczną właściwość z TextBox:
<TextBox>
<TextBox.Text>
<Binding Source="{x:Static local:VersionManager.FilterString}"/>
</TextBox.Text>
</TextBox>
Wszystko się kompiluje, ale w czasie wykonywania pojawia się następujący wyjątek:
Nie można przekonwertować wartości atrybutu „Source” na obiekt typu „System.Windows.Markup.StaticExtension”. Błąd w obiekcie „System.Windows.Data.Binding” w pliku znaczników „BurnDisk; component / selectversionpagefunction.xaml” Wiersz 57 Pozycja 29.
Masz pojęcie, co robię źle?
źródło
Nie możesz przywiązywać się do takiego statycznego. Nie ma możliwości, aby infrastruktura powiązania otrzymywała powiadomienia o aktualizacjach, ponieważ nie ma
DependencyObject
(lub wystąpienia obiektu, które implementujeINotifyPropertyChanged
).Jeśli ta wartość się nie zmieni, po prostu porzuć powiązanie i użyj
x:Static
bezpośrednio wewnątrzText
właściwości. Zdefiniujapp
poniżej jako lokalizację przestrzeni nazw (i zestawu) klasy VersionManager.Jeśli wartość się zmieni, sugerowałbym utworzenie singletona zawierającego wartość i powiązanego z nią.
Przykład singletona:
źródło
W .NET 4.5 można powiązać właściwości statyczne, przeczytaj więcej
źródło
Począwszy od WPF 4,5 można powiązać bezpośrednio z właściwościami statycznymi, a powiązanie jest automatycznie aktualizowane po zmianie właściwości. Musisz ręcznie połączyć zdarzenie zmiany, aby wyzwolić aktualizacje powiązań.
Możesz teraz powiązać swoją statyczną właściwość tak jak każdą inną:
źródło
VersionManager
Klasa może być statyczna i wszystko nadal działa. Zwróć uwagę na nawiasy klamrowe w definicji ścieżkiPath=(local:VersionManager.FilterString)
. Czy ktoś wie, dlaczego są faktycznie potrzebne?Mogą istnieć dwa sposoby / składnia na powiązanie
static
właściwości. Jeśli p jeststatic
własnością w klasieMainWindow
, tobinding
fortextbox
będzie:1.
2.
źródło
Możesz użyć
ObjectDataProvider
klasy i jejMethodName
właściwości. Może to wyglądać tak:Zadeklarowany dostawca danych obiektowych może być używany w następujący sposób:
źródło
Jeśli korzystasz z zasobów lokalnych, możesz się do nich odwołać, jak poniżej:
źródło
Odpowiedni wariant dla .NET 4.5 +
Kod C #
Powiązanie XAML (uwaga na nawiasy klamrowe, którymi są (), a nie {})
źródło
Spójrz na mój projekt CalcBinding , który umożliwia pisanie złożonych wyrażeń w wartości właściwości Path, w tym właściwości statycznych, właściwości źródłowych, Math i innych. Możesz więc napisać to:
Powodzenia!
źródło
Wszystkie te odpowiedzi są dobre, jeśli chcesz przestrzegać dobrych konwencji, ale OP chciał czegoś prostego , czego też chciałem, zamiast zajmować się wzorcami projektowymi GUI. Jeśli wszystko, co chcesz zrobić, to mieć ciąg w podstawowej aplikacji GUI, możesz aktualizować ad-hoc bez niczego szczególnego, możesz po prostu uzyskać do niego dostęp bezpośrednio w źródle C #.
Załóżmy, że masz naprawdę podstawową aplikację WPF MainWindow XAML, taką jak ta,
To będzie wyglądać mniej więcej tak:
W źródle MainWindow XAML jest, można mieć coś takiego, gdzie wszystko robimy na zmianę wartości bezpośrednio poprzez
textBlock.Text
„sget
/set
funkcjonalność:Następnie, gdy uruchomisz zdarzenie kliknięcia, klikając przycisk, voila! Pojawia się Kilroy :)
źródło
Innym rozwiązaniem jest utworzenie normalnej klasy, która implementuje PropertyChanger w ten sposób
Następnie utwórz statyczną instancję klasy gdzieś, gdzie nie chcesz
A teraz użyj go jako właściwości statycznej
A oto implementacja PropertyChanger, jeśli to konieczne
źródło
Najmniejsza odpowiedź (.net 4.5 i nowsze):
i XAML:
Nie zaniedbuj nawiasów
źródło