2015-11-13 16 views
7
<!-- View --> 
    <TextBox Text="{Binding str, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

    // View Model 
    private string _str; 
    public string str 
    { 
     get { return _str; } 
     set 
     { 
      if (!value.Contains("a")) 
       _str = value; 

      OnPropertyChanged(nameof(str)); 
     } 
    } 

Quando si digita nel controllo TextBox voglio che buttare fuori tutti i caratteri non validi (in questo caso di esempio la lettera 'a', ma potrebbe davvero essere per nulla). Per esempio:UWP TextBox non rispettare TwoWay vincolante quando si digita

  1. utente digita 'fds' seguito da una 'a'
  2. str rileva una, in modo da non impostata _str a 'fdsa', tenerlo a 'FDS' ma genera l'evento in ogni caso per indicare alla vista di buttare fuori la 'a'.
  3. In WPF, questo risulta nella casella di testo contenente 'fds'. In UWP, questo risulta nella casella di testo che contiene erroneamente 'fdsa' ancora.

Sembra che in UWP quando un controllo è attivo, non rispetterà il binding TwoWay.

Posso creare un pulsante con un evento Click che, se premuto, aggiorna correttamente il mio TextBox.

private void btn_Click(object sender, RoutedEventArgs e) 
    { 
     OnPropertyChanged(nameof(str)); 
    } 

Abbiamo molti ViewModels che abbiamo bisogno di usare sia in WPF e viste UWP, e noi abbiamo questo comportamento richiesto in tutto il luogo. Qual è una buona soluzione a questo problema?

* EDIT *

tornati al problema dopo il fine settimana e sembra essersi risolto. Non ho idea del perché. Sto chiudendo la domanda per ora.

+0

Penso che sia un tipo di problema relativo a UWP, vedo un sacco di persone che si lamentano del bind a doppio senso su uwp, ho fatto un test qui su un'applicazione desktop e funziona perfettamente. Forse un convertitore può aiutarti. –

+0

Trovo che funzioni sempre bene finché imposto in modo esplicito UpdateSourceTrigger = PropertyChanged – Saxar

+0

Hai mai capito perché è successo? Sto avendo questo problema. – user3007447

risposta

1

È possibile utilizzare un convertitore per risolvere il problema, è possibile elaborare un convertitore migliore, nel mio esempio uso solo un convertitore stupido per dimostrare la mia idea.

Converter:

public class Converter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value != null) 
     { 
      var someString = value.ToString(); 
      return someString.Replace("a", ""); 
     } 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; 
    } 
} 

XAML

<TextBox Text="{Binding Str, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource converter}}"/> 

Si potrebbe usare un comportamento collegato anche.

+1

Ho notato prima di pubblicare risposte WPF a domande che non riguardano WPF. Prova a prestare attenzione ai tag delle domande, risparmia a tutti un sacco di tempo, incluso te stesso. –

Problemi correlati