2012-03-23 2 views
0

Ich habe mehrere Steuerelemente einschließlich einer DataGrid, die ich deaktiviert werden soll, bis ein gültiger Wert in der ersten TextBox in der Präsentation ist. Also habe ich eine boolsche Eigenschaft hinzugefügt, an die ich in der VM binde und binde sie in der XAML (unten).Datenbindung und Fokuskoordination

Die Bindung funktioniert, hat aber den Nebeneffekt, den Benutzer in der TextBox (MoneyToAllocate) "einzufangen".

Vermutlich liegt das daran, dass die TB-Bindung LostFocus ist und es keinen Platz für den Fokus gibt, um die Aktualisierungen tatsächlich auszulösen. Was ist eine gute Möglichkeit, das zu beheben?

Cheers,
Berryl

Ansichtsmodell

public bool HasMoneyToAllocate { get { return MoneyToAllocate.Amount > 0; } } 

public Money MoneyToAllocate { 
    get { return _moneyToAllocate; } 
    set { 
     if (value.Amount < 0) return; 

     _moneyToAllocate = new Money(value.Amount, SelectedCurrency); 
     NotifyPropertyChanged(() => HasMoneyToAllocate); 
    } 
} 

Ansicht

<TextBox Text="{Binding MoneyToAllocate, Converter={StaticResource moneyConverter}}" /> 

    <DataGrid IsEnabled="{Binding HasMoneyToAllocate}" ... 

EDIT

ich hinzugefügt haben sollte, dass ich Property für Update versucht, aber es wird ein bisschen chaotisch seit dem Wert des Textfelds muss vom Konverter formatiert werden. Irgendwelche anderen Ideen?

FINAL EDIT

gewickelt ich eine andere Steuerung zu lassen, die bisher kein Register war ein Tabstopp zu stoppen sein, so dass das Textfeld hatte einen Platz zu gehen. Phil hat das Problem am besten verstanden und erhält die Antwort, obwohl der Wertebereich, den der Benutzer eingeben kann (.001 bis dezimal.MaxValue), ein Up-Down unpraktisch macht.

Antwort

2

Verwenden UpdateSourceTrigger=PropertyChanged

<TextBox 
    Text="{Binding MoneyToAllocate, UpdateSourceTrigger=PropertyChanged, 
      Converter={StaticResource moneyConverter}}" /> 
+0

siehe Bearbeiten. – Berryl

+0

Wie wäre es mit einem DecimalUpDown-Steuerelement, z. B. aus dem erweiterten WPF-Toolkit? Erzwinge dort immer eine gültige Nummer im Steuerelement und aktiviere den Rest der Benutzeroberfläche, wenn es> 0 ist. – Phil

1

Dann haben Sie Update = Property
verwenden - wenn Sie verwenden, dass die Bindung mit dem Sie den Wert in der VM wird nicht ausgeführt, bis die Fokus bewegt sich von der textBox
- Wenn Sie jedoch UpdateSourceTrigger = PropertyChanged zu Ihrer Bindung hinzufügen, wird die VM-Eigenschaft (MoneyToAllocate) sofort ausgeführt (wenn sich der textBox.Text-Wert ändert)

+0

siehe Bearbeiten. – Berryl