每次单击按钮时,将更新的变量数据分配给TextBlock

时间:2019-04-13 06:52:35

标签: c# wpf xaml desktop-application

我正在尝试创建一个小程序,但是如果您单击增加按钮,数字将加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 个答案:

答案 0 :(得分:1)

您有正确的想法,但有一些缺失的地方:

1)XAML UI正在监视Number属性的更改,以便可以更新,但是您的increase()decrease()方法仅更新了后备变量。您必须直接设置Number属性。

2)您在Number上的setter方法需要告诉XAML UI在更改时进行更新。这是通过在属性设置器中调用OnPropertyChangedEvent来完成的,请参见https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface(它讨论的是Windows窗体,但机制相同)

答案 1 :(得分:1)

您的XAML看起来不错。只是为了澄清,您没有将_number绑定到TextBlock。 _number是私有变量,UI不可访问。您应该将公共属性Number绑定到TextBlock,如您所愿。

正如MarcE在他的帖子中所描述的那样,麻烦来自于ViewModel。 Number属性的Setter需要调用PropertyChanged方法,该方法需要添加;并且您的增加和减少方法需要直接修改Number属性,而不是其后备变量。 当您仅修改后备变量时,就永远不会调用属性的setter,因此UI也不会得到更新。

下面显示的是所需的代码修改:

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));
  }
}

大部分时间都在那儿。

答案 2 :(得分:-1)

number属性的set方法未触发OnPropertyChanged事件。在此处查看详细信息https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification