我是WPF的新手,对C#来说相当新,我跟随Head First C#2nd Ed。 p.218(但是WPF版本而不是WinForms版本)。我的表单上有一个TextBox
,我想在表单加载时显示一个默认字符串。我有两个问题:
如果我在我的XAML代码中设置Text
属性,TextChanged
事件会在表单加载时触发,我会得到NullReferenceException
。这是我的XAML片段:
<TextBox Name="cakeWritingText" Text="Happy Birthday" TextChanged="cakeWritingText_TextChanged" />
如果我在我的代码中设置了值(并删除了XAML Text
属性),请执行以下操作:cakeWritingText.Text = "Happy Birthday";
,我收到此错误:
没有为任何调用堆栈帧加载符号。无法显示源代码。
这是完整的事件处理程序:
private void cakeWritingText_TextChanged(object sender, TextChangedEventArgs e)
{
birthdayParty.CakeWriting = cakeWritingText.Text;
DisplayBirthdayPartyCost();
}
和MainWindow
构造函数:
public MainWindow()
{
InitializeComponent();
dinnerParty = new DinnerParty(5, (bool)healthyCheckBox.IsChecked, (bool)fancyCheckBox.IsChecked);
DisplayDinnerCost();
birthdayParty = new BirthdayParty(5, (bool)fancyBdayCheckBox.IsChecked, cakeWritingText.Text);
numPeopleBdayUpDown.Value = 5;
cakeWritingText.Text = "Happy Birthday";
DisplayBirthdayPartyCost();
}
将默认字符串放在TextBox
中的最佳方法是什么?
答案 0 :(得分:2)
设置默认的硬编码值的最佳方法是在XAML中,因此您的第一种方法是正确的。问题出现在TextChanged
事件的事件处理程序中。此事件将在InitializeComponent
内触发,此时您的birthdayParty
变量将不会被设置,因此NullReferenceException
。
要解决此问题,请在事件处理程序中检查您的birthdayParty
变量是否已初始化。所以你的事件处理程序将如下所示:
private void cakeWritingText_TextChanged(object sender, TextChangedEventArgs e)
{
if (birthdayParty == null)
{
return;
}
birthdayParty.CakeWriting = cakeWritingText.Text;
DisplayBirthdayPartyCost();
}
这显然会导致您错过CakeWriting
属性的第一个设置,因此在初始化变量后,您需要在构造函数中获取此值。
但是,如果您希望CakeWriting
属性始终保留TextBox
中的值,请查看WPF Data Binding。这是在WPF内部使用同步UI和数据模型值的更好方法。另请阅读本文关于The Model-View-ViewModel Pattern的内容,这可能是您希望尝试实施的内容。
答案 1 :(得分:1)
您可以使用以下方式明确指定回退值:
<TextBox Text="{Binding MyStringProperty,FallbackValue='Not available'}" />
这假设您正在使用数据绑定,就像您采用MVVM设计模式一样,我建议将here描述为多种原因。