Как установить значения по умолчанию в приложении WPF? - PullRequest
0 голосов
/ 04 февраля 2012

Я новичок в WPF и довольно новичок в C #, и я следую за Head First C # 2nd Ed. стр.218 (но версия WPF вместо версии WinForms). У меня есть TextBox в моей форме, и я хочу, чтобы при загрузке формы отображалась строка по умолчанию. У меня две проблемы:

  1. Если я установлю свойство Text в своем коде XAML, событие 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?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Лучший способ установить значение по умолчанию в жестком коде - использовать 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 и значений модели данных.Также прочитайте эту статью о паттерне Model-View-ViewModel , который, вероятно, вы хотите попытаться реализовать.

1 голос
/ 04 февраля 2012

Вы можете указать запасное значение в десятичном виде, используя:

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

Предполагается, что вы используете привязку данных, как если бы вы использовали шаблон проектирования MVVM, который я рекомендовал бы по ряду причин, описанных здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...