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