Inkrementacja Textbox'a w czasie rzeczywistym

0

Cześć wszystkim,

zrobiłem sobie kilka Texboxów w WPF i mam zaimplementowany interface INotifyPropertyChanged by mieć aktualizacje na bieżąco.

Chce uzyskać inkrementacje wartości z textBox1 do textBox2 w czasie rzeczywistym dla przykładu:

-Wpisuje wartość "10" w textBox1
-W textbox2 pojawia się "11"

Próbowałem różnych i najlepszy wynik uzyskałem kodem poniżej tyle że wynik aktualizuje się dopiero gdy przerzucę focus na textbox2 i spróbuję coś wpisać, zna ktoś rozwiązanie na ten problem?

Z góry dziękuje za odpowiedź

W MainWindow.xaml

<TextBox Grid.Row="1"
         Grid.Column="1"
         VerticalAlignment="Center"
         HorizontalAlignment="Center"
         TextAlignment="Left"
         Height="30"
         Width="50"
         Text="{Binding Tool.Number, UpdateSourceTrigger=PropertyChanged}"
         x:Name="Okno1"
         />
<TextBox Grid.Row="2"
         Grid.Column="1"
         VerticalAlignment="Center"
         HorizontalAlignment="Center"
         TextAlignment="Left"
         Height="30"
         Width="50"
         Text="{Binding Tool.Number1, UpdateSourceTrigger=PropertyChanged}"
         x:Name="Okno2"
         />

W klasie ViewModel

public class ToolsViewModel : ObservableObject

{
    private string _number;
    private string _number1;

    public string Number
    {
        get
        {
            if (string.IsNullOrEmpty(_number))
                return "0";
            return _number;
        }
        set
        {
            _number = value ;
            OnPropertyChanged("Number");
        }
    }

    public string Number1
    {
        get
        {
            if (string.IsNullOrEmpty(_number))
                return "1";

            return _number1;
        }
        set
        {
            int a = Int32.Parse(_number);
            int b = a + 1;
            _number1 = b.ToString() ;
            OnPropertyChanged("Number1");
        }
    }
1

Number1 musisz aktualizować w set Number

0
abrakadaber napisał(a):

Number1 musisz aktualizować w set Number

Dzięki wielkie teraz działa tak jak chciałem, takie szybkie rozwiązanie a tyle czasu na to straciłem haha

1

zachęcam Cię do przenoszenia logiki z getterow i setterow VieModelu jak najgłębiej w model .

Dzięki temu znacznie oczyścisz ViewModel i łatwiej będzie Ci czytać co się dzieje w danym miejscu, a dwa to upłynnisz działanie swojego programu - mam na myśli przypadek gdy będziesz miał sporo takich pól w ViewModelu gdzie zwykły getter zanim ma cos wyświetlić będzie musiał to obliczyć. a już w ogóle to zauważysz gdy np. będziesz miał kolekcje w ObservableCollection listę ViewModeli i każdy z nich będzie miał w getterach cos do wyliczenia przed wystawieniem na widok.

proponuje cos takiego i konsekwentnie od najprostszych projektów już to stosować.

    public class ToolsViewModel : INotifyPropertyChanged
    {
        private Model model = new Model();

        public string Number
        {
            get { return model.Number.ToString(); }
            set
            {
                int result = 0;

                if (Int32.TryParse(value, out result))
                    model.Number = result;
                else
                    model.Number = 0;
                OnPropertyChanged(nameof(Number));
                OnPropertyChanged(nameof(Number1));
            }
        }



        public string Number1
        {
            get {  return model.Number1.ToString(); } //aby przeszlo bez settera, w TextBox2 ustaw Text="{Binding Number1, Mode=OneWay}"
        }
        
        (...)
    }

    public class Model
    {
        private int _number;

        public int Number
        {
            get { return _number; }
            set { _number = value; }
        }

        public int Number1 { get {  return _number + 1;  } }
    }
1

Co do pytania o "płynniejsze" odswiezanie widoku (teraz masz to dopiero po zmianie focusa z TextBox1 na TextBox2), proponuje obejrzeć z tego kursu poniżej część nt poleceń.

Takie polecenie można powiązać z przyciskiem Button i wtedy po naciśnięciu go nastąpi odświeżenie widoku, można tez to polecenie powiązać z naciśnięciem klawisza ENTER dla kontrolki TextBox1 i wtedy po wprowadzeniu liczby i naciśnięciu entera od razu wyświetli się aktualizacja w TextBox2, albo jeszcze wykorzystać zachowanie - czyli taka trochę analogia zdarzenia TextChanged z WinForms.

Wzorzec MVVM w WPF - cały kurs
_

0
Varran napisał(a):

Co do pytania o "płynniejsze" odswiezanie widoku (teraz masz to dopiero po zmianie focusa z TextBox1 na TextBox2), proponuje obejrzeć z tego kursu poniżej część nt poleceń.

Takie polecenie można powiązać z przyciskiem Button i wtedy po naciśnięciu go nastąpi odświeżenie widoku, można tez to polecenie powiązać z naciśnięciem klawisza ENTER dla kontrolki TextBox1 i wtedy po wprowadzeniu liczby i naciśnięciu entera od razu wyświetli się aktualizacja w TextBox2, albo jeszcze wykorzystać zachowanie - czyli taka trochę analogia zdarzenia TextChanged z WinForms.

Wzorzec MVVM w WPF - cały kurs

Dzięki wielkie za uwagi, zaraz przeanalizuje sobie ten kod i obejrzę filmik

0
Varran napisał(a):

zachęcam Cię do przenoszenia logiki z getterow i setterow VieModelu jak najgłębiej w model .

Dzięki temu znacznie oczyścisz ViewModel i łatwiej będzie Ci czytać co się dzieje w danym miejscu, a dwa to upłynnisz działanie swojego programu - mam na myśli przypadek gdy będziesz miał sporo takich pól w ViewModelu gdzie zwykły getter zanim ma cos wyświetlić będzie musiał to obliczyć. a już w ogóle to zauważysz gdy np. będziesz miał kolekcje w ObservableCollection listę ViewModeli i każdy z nich będzie miał w getterach cos do wyliczenia przed wystawieniem na widok.

proponuje cos takiego i konsekwentnie od najprostszych projektów już to stosować.

    public class ToolsViewModel : INotifyPropertyChanged
    {
        private Model model = new Model();

        public string Number
        {
            get { return model.Number.ToString(); }
            set
            {
                int result = 0;

                if (Int32.TryParse(value, out result))
                    model.Number = result;
                else
                    model.Number = 0;
                OnPropertyChanged(nameof(Number));
                OnPropertyChanged(nameof(Number1));
            }
        }



        public string Number1
        {
            get {  return model.Number1.ToString(); } //aby przeszlo bez settera, w TextBox2 ustaw Text="{Binding Number1, Mode=OneWay}"
        }
        
        (...)
    }

    public class Model
    {
        private int _number;

        public int Number
        {
            get { return _number; }
            set { _number = value; }
        }

        public int Number1 { get {  return _number + 1;  } }
    }

Po obejrzeniu kursu i po zaimplementowaniu zmian w kodzie zapaliła się lampka jak to wszystko się łączy haha, dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1