首页 > 解决方案 > 每次单击按钮时将更新的变量数据分配给 TextBlock

问题描述

我正在尝试创建一个小程序,而如果单击增加按钮,数字将加 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。我在这里做错什么了吗?

标签: c#wpfxamldesktop-application

解决方案


您的 XAML 看起来不错。只是为了澄清一下,您没有绑定_number到 TextBlock。 _number是私有变量,UI 无法访问。您应该将公共属性数据绑定Number到 TextBlock。

正如 MarcE 在他的帖子中所描述的,问题出在您的 ViewModel 中。您的属性的 SetterNumber需要调用您的 PropertyChanged 方法,需要添加该方法;并且您的增减方法需要Number直接修改属性而不是其支持变量。当您只修改支持变量时,您的属性的设置器永远不会被调用,因此 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));
  }
}

你的大部分时间都在那里。


推荐阅读