如何在WPF应用程序中设置默认值?

时间:2012-02-04 08:53:52

标签: c# wpf

我是WPF的新手,对C#来说相当新,我跟随Head First C#2nd Ed。 p.218(但是WPF版本而不是WinForms版本)。我的表单上有一个TextBox,我想在表单加载时显示一个默认字符串。我有两个问题:

  1. 如果我在我的XAML代码中设置Text属性,TextChanged事件会在表单加载时触发,我会得到NullReferenceException。这是我的XAML片段:

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

  2. 如果我在我的代码中设置了值(并删除了XAML Text属性),请执行以下操作:cakeWritingText.Text = "Happy Birthday";,我收到此错误:

  3.   

    没有为任何调用堆栈帧加载符号。无法显示源代码。

    这是完整的事件处理程序:

    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 个答案:

答案 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描述为多种原因。