在WPF形式的.NET框架中,我试图实现以下(看似(简单的任务:
我有3个按钮和3个文本框:
按钮1文本框1
按钮2文本框2
按钮3文本框3
如果我单击按钮1,我希望文本框1显示为true,另2显示为false。如果我单击按钮2,我希望文本框2分别显示true和false,按钮3和文本框3也是如此。
我想我可以通过将所有布尔值设置为true或false来实现这一点,这取决于使用点击事件点击的按钮,但没有得到预期的结果
using System;
using System.Windows;
using System.Threading;
using System.Windows.Threading;
namespace WPF_Test
{
public partial class MainWindow : Window
{
bool value1;
bool value2;
bool value3;
public MainWindow()
{
InitializeComponent();
if (value1 == true)
{
textbox1.Text = value1.ToString();
} else if (value2 == true){
textbox2.Text = value2.ToString();
} else if (value3 == true){
textbox3.Text = value3.ToString();
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
value1 = true;
value2 = false;
value3 = false;
}
private void button2_Click(object sender, RoutedEventArgs e)
{
value1 = false;
value2 = true;
value3 = false;
}
private void button3_Click(object sender, RoutedEventArgs e)
{
value1 = false;
value2 = false;
value3 = true;
}
}
}
知道我可能错过了什么吗?
引用Rekshino的评论:
只需将InitializeComponent之后构造函数中的代码移动到单独的方法,然后在每个按钮的底部调用它。单击事件处理程序。–Rekshino
然而,我有限的知识并不能证明这是"最好的"版本,因此我参考了DM的答案以及
为了通过绑定到代码后面的值来更新WPF中的UI,您需要将字段更改为属性并实现INotifyPropertyChanged
接口。马克·格雷维尔(Marc Gravell(给出了一个非常好的答案。
public partial class MainWindow : Window, INotifyPropertyChanged
{
private bool _value1;
public bool value1
{
get => _value1;
set => SetField(ref _value1, value);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
value1 = true;
}
// Implementation of INotifyPropertyChanged with a
// SetField helper method to ensure you're only
// notifying when a value actually changes.
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string? propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}