2012-02-23 12 views
12

Nowość w WPF. Mam numeryczną klawiaturę na ekranie, aby wpisać kod PIN. Chcę tylko wyłączyć przyciski po wprowadzeniu czterech cyfr kodu PIN. Z pewnością mogę to zrobić za pomocą kodu dość łatwo, ale wydaje mi się, że jest to coś, co należy zrobić z wiązaniem.Wiązanie z wyrażeniem

Coś jak:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox ???}/> 

Wydaje się, że nie jest to sposób, aby to zrobić więc rozważyć alternatywę, która jest zwykły obiekt w (który szczerze mówiąc wydaje mi się raczej prymitywne). podstawowa klasa okna. Ale nie jestem pewien, jak powiązać go (czy muszę określić klasę jako własny kontekst danych, czy muszę wyodrębnić ciąg PIN do modelu widoku?)

A następnie, w jaki sposób Otrzymuję zwykłą właściwość do aktualizacji GUI.

Przypuszczam, że mogłem zdefiniować klasę widoku modelu i mieć właściwość zależności o nazwie "ButtonsEnabled", ale wydaje się ona być waga ciężka dla tak prostego problemu.

Daj mi znać, jeśli czegoś brakuje.

+0

można spróbować [** wiążący swój komponent (przycisk) do a funkcja **] (http://social.msdn.microsoft.com/Forums/en/wpf/thread/b92178bc-bc1a-4ec0-ad94-b86bbf2ea56a) –

Odpowiedz

11

Można napisać konwerter które zwracają logiczna zależności od cyfr w pole tekstowe

XAML fo przycisk R byłoby

<Button Content="Test" IsEnabled="{Binding ElementName=PinBox,Path=Text,Converter={StaticResource DigitsToBoolConverter}}" Grid.Row="1" Height="20" Width="100"></Button> 

gdzie PinBox jest nazwą pola tekstowego używanego do wprowadzania numeru PIN.

Funkcja Converter jest

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    return value.ToString().Length >= 4; 
} 
3

Nie, niczego nie brakuje, Wiązki WPF z pudełka nie obsługują wyrażeń.

Nastąpił niektórzy ludzie realizują swoje własne zajęcia, które dodają tego typu funkcjonalności: http://www.11011.net/wpf-binding-expressions

Ale tak naprawdę, to jest to, co jest na wzór ViewModel. Użyj go, to nie jest waga ciężka.

+0

ten link już nie działa. – brainydexter

+0

Biorąc pod uwagę to, że minęło ponad 5 lat, nie jestem zaskoczony :) – Tyson

+0

@brainydexter można użyć maszyny do powrotu? https://web.archive.org/web/20160313063004/http://www.11011.net/wpf-binding-expressions Ale biorąc pod uwagę jego ponad 5 lat sugerowałbym świeże google "wiązanie wpf, w tym wyrażenie" lub coś takiego tak. – Tyson

0

Utwórz converter, który zwróci wartość true lub false w oparciu o PinBox.Text.Length.

Twój XAML by następnie stać:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox, Converter={StaticResource yourConverter}}/> 
8

Innym sposobem korzystania commands:

XAML:

<Button Content="2" Style="Whatever" Command={Binding MyCommand} CommandParamater="2"/> 

ViewModel:

public ICommand MyCommand { get; private set; } 
public string PinNumber { get; private set; } 
public void Init() 
{ 
    MyCommand = new RelayCommand(
    param => AddPinNumberDigit(param), 
    param => CanAddPin); 
} 
private void AddPinNumberDigit(string digit) 
{ 
    PinNumber += digit; 
} 
public bool CanAddPin { 
    get 
    { 
    return PinNumber.Length < 3; 
    } 
} 
+0

Uwielbiam tę odpowiedź i wiele się od niej nauczyłem, ale ostatecznie użyłem konwertera. Chciałabym móc zaakceptować obie, ale ja cię upomniałem. –