WPF 数据绑定,值不会更新
WPF Databinding, value won't update
我知道这是一个非常常见的问题,但是当更改按钮内容的 "Default" 时,我无法让按钮更新到 "Pressed1" 和 "Pressed2" 内容。看了几个问题后,我找不到适合我的答案,我根本找不到这里出了什么问题,所以这是糟糕的代码:
带按钮的window
public partial class MainWindow : Window
{
Code_Behind cB;
public MainWindow()
{
cB = new Code_Behind();
this.DataContext = cB;
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
cB.buttonPressed();
}
}
这是单独的 class
public class Code_Behind : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _buttonContent = "Default";
public string buttonContent
{
get { return _buttonContent; }
set {
if (_buttonContent != value)
{
buttonContent = value;
OnPropertyChanged("buttonContent");
}
}
}
public void buttonPressed()
{
int timesPressed = 0;
if (timesPressed != 1)
{
_buttonContent = "Pressed1";
timesPressed++;
}
else if (timesPressed != 2)
{
_buttonContent = "Pressed2";
timesPressed++;
timesPressed = 0;
}
}
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
您没有设置 属性,而是设置了支持字段。因此 PropertyChanged
事件不会被触发。
替换
_buttonContent = "Pressed1";
...
_buttonContent = "Pressed2";
和
buttonContent = "Pressed1";
...
buttonContent = "Pressed2";
除此之外,使用 Pascal 大小写 属性 名称是一种广泛接受的惯例,即 ButtonContent
而不是 buttonContent
。
此外,您的 属性 setter 看起来很奇怪(可能是因为您试图在一行中压缩太多代码)。
而不是
set
{
if (_buttonContent != value)
{
_buttonContent = value;
}
OnPropertyChanged("buttonContent");
}
应该是
set
{
if (_buttonContent != value)
{
_buttonContent = value;
OnPropertyChanged("buttonContent");
}
}
我知道这是一个非常常见的问题,但是当更改按钮内容的 "Default" 时,我无法让按钮更新到 "Pressed1" 和 "Pressed2" 内容。看了几个问题后,我找不到适合我的答案,我根本找不到这里出了什么问题,所以这是糟糕的代码:
带按钮的window
public partial class MainWindow : Window
{
Code_Behind cB;
public MainWindow()
{
cB = new Code_Behind();
this.DataContext = cB;
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
cB.buttonPressed();
}
}
这是单独的 class
public class Code_Behind : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _buttonContent = "Default";
public string buttonContent
{
get { return _buttonContent; }
set {
if (_buttonContent != value)
{
buttonContent = value;
OnPropertyChanged("buttonContent");
}
}
}
public void buttonPressed()
{
int timesPressed = 0;
if (timesPressed != 1)
{
_buttonContent = "Pressed1";
timesPressed++;
}
else if (timesPressed != 2)
{
_buttonContent = "Pressed2";
timesPressed++;
timesPressed = 0;
}
}
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
您没有设置 属性,而是设置了支持字段。因此 PropertyChanged
事件不会被触发。
替换
_buttonContent = "Pressed1";
...
_buttonContent = "Pressed2";
和
buttonContent = "Pressed1";
...
buttonContent = "Pressed2";
除此之外,使用 Pascal 大小写 属性 名称是一种广泛接受的惯例,即 ButtonContent
而不是 buttonContent
。
此外,您的 属性 setter 看起来很奇怪(可能是因为您试图在一行中压缩太多代码)。
而不是
set
{
if (_buttonContent != value)
{
_buttonContent = value;
}
OnPropertyChanged("buttonContent");
}
应该是
set
{
if (_buttonContent != value)
{
_buttonContent = value;
OnPropertyChanged("buttonContent");
}
}