2012-02-04 160 views
0

我是新来的WPF和相当新的C#和我沿着头第一个C#第二版。第218页(但是一个WPF版本,而不是WinForms版本)。我的表单上有一个TextBox,我想在窗体加载时显示一个默认字符串。我有两个问题:如何在WPF应用程序中设置默认值?

  1. 如果我在XAML代码中设置Text属性,在窗体加载的TextChanged事件触发,我得到一个NullReferenceException。这是我的XAML代码段:

    <TextBox Name="cakeWritingText" Text="Happy Birthday" TextChanged="cakeWritingText_TextChanged" />

  2. 如果我把我的代码,而不是值(和删除XAML Text属性)是这样的:cakeWritingText.Text = "Happy Birthday";,我得到这个错误:

No symbols are loaded for any call stack frame. The source code cannot be displayed.

以下是完整的事件处理程序:

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默认的字符串的最佳方式?

回答

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

可以declaritively使用指定的回退值:

<TextBox Text="{Binding MyStringProperty,FallbackValue='Not available'}" /> 

这里假设你正在使用数据绑定,你会如果你是采用MVVM设计模式,这我会建议一些原因说明here

相关问题