【发布时间】:2019-01-11 16:02:17
【问题描述】:
我正在尝试使用 WPF 构建一个计算器。我正在使用多个页面,以便我可以练习在页面之间使用数据绑定。但是,我的显示器没有正确绑定。当我点击“0”时,我希望显示器显示“0”。输入数字时显示不更新。
我意识到关于 SO 有许多类似的问题。这些问题与我的不同之处在于我已经在实施 INotifyPropertyChanged,但这并没有解决我的问题。
代码设置
“数字键盘”包含数字按钮 0-9。 “显示”只是顶部的一个大按钮,应该显示点击的数字。
NumberPad.xaml.cs
public partial class NumberPad : Page
{
Display m_display;
public NumberPad()
{
InitializeComponent();
m_display = new Display();
this.DataContext = m_display;
}
private void Button0_Click(object sender, RoutedEventArgs e)
{
m_display.EquationText = "0";
}
private void Button1_Click(object sender, RoutedEventArgs e)
{
m_display.EquationText = "1";
}
}
Display.xaml.cs
public partial class Display : Page, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string m_equationText;
public Display()
{
InitializeComponent();
EquationText = "Hi";
}
public string EquationText
{
get { return m_equationText; }
set
{
m_equationText = value;
OnPropertyChanged("EquationText");
}
}
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Display.xaml
<Page x:Class="WPFCalculator.Display"
x:Name="_this"
....
Title="Display">
<Button Content="{Binding ElementName=_this, Path=EquationText, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource buttonStyle}" FontSize="60">
</Button>
</Page>
预期:我应该能够按 0 或 1 并且其对应的数字会显示在显示屏的按钮中。实际:在整个执行过程中只显示“Hi”。
关于 Display.xaml 的重要说明
我在“ElementName=_this, Path=”中添加了“Hi”显示。如果我只有“Binding EquationText”,它不会显示“Hi”或 0 或 1 或任何东西。我包含此代码是因为它是使 Display 当前显示任何内容的唯一方法。
结论
总而言之,我相信 DataContext 被设置为与实际绑定的不同对象的 EquationText 属性。如何以 NumberPad 可以更新的方式将显示数据绑定到属性?
谢谢!
【问题讨论】:
-
你不应该练习不同页面之间的数据绑定;相反,您应该练习视图和数据上下文(即视图模型)之间的数据绑定。一个简单的计算器应用程序是学习 MVVM 的完美方式。只有 MVVM 方法才能真正释放 WPF 的力量。
-
@dymanoid,感谢您的回复。我明白你在说什么!我将很快启动另一个测试项目来练习数据绑定,就像它的实际意图一样。
标签: c# wpf xaml data-binding datacontext