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

本文关键字:设置 默认值 应用程序 WPF | 更新日期: 2023-09-27 18:22:46

我是WPF的新手,也是C#的新手,我正在遵循Head First C#第二版第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";,则会出现以下错误:

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

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

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中放置默认字符串的最佳方式是什么?

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

设置默认硬编码值的最佳方法是在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数据绑定。这是在WPF内部同步UI和数据模型值的更好方法。还可以阅读这篇关于模型视图视图模型模式的文章,这可能是您想要尝试实现的。

您可以使用解密指定回退值

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

这假设您使用的是数据绑定,就像您采用MVVM设计模式一样,出于这里描述的许多原因,我建议您使用MVVM。