我正在尝试创建一个小程序,而如果单击“增加”按钮,则数字将添加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。我在这里做错了吗?
你有正确的想法,但你有几个缺失的部分:
1)XAML UI正在监视Number
属性的更改,以便更新,但您的increase()
和decrease()
方法仅更新后备变量。您必须直接设置Number
属性。
2)你在Number
上的setter方法需要告诉XAML UI在更改时更新。这是通过在属性setter中调用OnPropertyChangedEvent来完成的 - 请参阅https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface(它讨论的是windows窗体,但机制是相同的)
你的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));
}
}
你大部分都在那里。
number属性的set方法未触发OnPropertyChanged事件。点击此处查看https://docs.microsoft.com/en-us/dotnet/framework/wpf/data/how-to-implement-property-change-notification的详细信息