C# 每次单击按钮时,将更新的变量数据分配给文本块

C# 每次单击按钮时,将更新的变量数据分配给文本块,c#,wpf,xaml,desktop-application,C#,Wpf,Xaml,Desktop Application,我正在尝试创建一个小程序,但是如果单击“增加”按钮,数字将增加1,反之亦然,单击“减少”按钮 我设法将_number值绑定到TextBlock(最初设置为0),但当我单击按钮时,似乎没有一个按钮添加或减去该值。或者如果值已更改,但未在窗口上更新 .xaml // MainWindow.xaml <Window x:Class="Home_Test.MainWindow" ... Title="MainWindow" Height="450" Width="800">

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

总的来说,我希望我的程序在单击按钮时加1或减1。
我在这里做错了什么吗?

number属性的set方法没有触发OnPropertyChanged事件。查看此处以了解详细信息

您的想法是正确的,但是您缺少了几块:

1) XAML UI正在监视
Number
属性的更改,以便进行更新,但您的
increase()
decrease()
方法只更新支持变量。您必须直接设置
Number
属性


2)
Number
上的setter方法需要通知XAML UI在更改时进行更新。这是通过在属性设置器中调用OnPropertyChangedEvent来完成的-请参阅(它讨论的是windows窗体,但机制是相同的)

您的XAML看起来不错。不过,为了澄清,您没有将
\u number
绑定到文本块<代码>\u编号是一个专用变量,用户界面无法访问。您将公共属性
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;
}
添加此代码以使
notifyPropertyChanged
功能正常工作

public event PropertyChangedEventHandler PropertyChanged;

public void NotifyPropertyChanged(string propertyName)
{
  if (PropertyChanged != null)
  {
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }
}
你在去那里的路上大部分时间都在那里

public event PropertyChangedEventHandler PropertyChanged;

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