Присваивать обновленные данные переменных текстовому блоку при каждом нажатии кнопки - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь создать небольшую программу, тогда как если вы нажмете кнопку увеличения, число добавится к 1, и наоборот для кнопки уменьшения.

Мне удалось связать значение _number с TextBlock (изначально установленным как 0), но когда я нажимаю кнопки, ни одна из них не добавляет и не вычитает значение. Или, если значение изменилось, но не обновилось в окне.

.xaml

// MainWindow.xaml
<Window x:Class="Home_Test.MainWindow"
    ...
    Title="MainWindow" Height="450" Width="800">
<Grid Name="MainGrid">
    <Button ...
            Content="Add" 
            Click="increase"/>
    <Button ...
            Content="Subtract"
            Click="decrease"/>
    <TextBlock 
             Name="txtbox"
             HorizontalAlignment="Center" 
             Height="23" 
             TextWrapping="Wrap" 
             Text="{Binding Path=Number}" 
             Width="120"
             Margin="0,100,0,0" />
</Grid>

.xaml.cs

using System;
using System.Windows;
using System.ComponentModel;
using System.Runtime.CompilerServices;
...

namespace Home_Test
{
    public partial class MainWindow : INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;
        }

    private int _number = 0;
    public int Number
    {
        get { return _number; }
        set
        {
            if (_number != value)
            {
                _number = value;
            }
        }
    }

    public void increase(object sender, RoutedEventArgs e)
    {
        _number += 1;
    }
    public void decrease(object sender, RoutedEventArgs e)
    {
        _number -= 1;
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

}

В целом, я ожидал, что моя программа добавит 1 или вычтет 1, когда я нажму кнопку. Я что-то здесь не так делаю?

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

У вас правильная идея, но у вас есть пара недостающих кусочков:

1) Пользовательский интерфейс XAML контролирует свойство Number на предмет изменений, чтобы оно могло обновляться, но ваши методы increase() и decrease() обновляют только резервную переменную. Вы должны установить свойство Number напрямую.

2) Ваш метод установки на Number должен сообщить пользовательскому интерфейсу XAML, чтобы он обновлялся при его изменении. Это делается путем вызова OnPropertyChangedEvent в установщике свойств - см. https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface (речь идет о формах окон, но механизм тот же)

1 голос
/ 13 апреля 2019

Ваш XAML выглядит хорошо.Просто чтобы прояснить, вы не привязали _number к TextBlock._number является закрытой переменной и недоступна для пользовательского интерфейса.Вы привязали данные к общедоступному свойству Number к TextBlock, как и должно быть.

Как MarcE описывал в своем посте, проблема возникает в вашей ViewModel.Установщик вашего свойства Number нуждается в вызове метода PropertyChanged, который необходимо добавить;и ваши методы увеличения и уменьшения должны модифицировать свойство Number напрямую, а не его вспомогательную переменную.Когда вы просто изменяете вспомогательную переменную, установщик вашего свойства никогда не вызывается, и поэтому пользовательский интерфейс никогда не обновляется.

Ниже показаны необходимые изменения кода:

private int _number = 0;
public int Number
{
    get { return _number; }
    set
    {
        if (_number != value)
        {
            _number = value;
            //After the setter updates the backing variable, this Updates the UI.
            NotifyPropertyChanged("Number");
        }
    }
}

public void increase(object sender, RoutedEventArgs e)
{
    Number += 1;
}
public void decrease(object sender, RoutedEventArgs e)
{
    Number -= 1;
}

Добавьте этокод для работы функции NotifyPropetyChanged.

public event PropertyChangedEventHandler PropertyChanged;

public void NotifyPropertyChanged(string propertyName)
{
  if (PropertyChanged != null)
  {
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}

Вы прошли большую часть пути.

0 голосов
/ 13 апреля 2019

Метод set свойства number не вызывает событие OnPropertyChanged.Проверьте здесь для деталей https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification

...