2012-02-04 127 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

相關問題