Как установить многострочное свойство для текстового поля, используемого в WPF databinding

#c# #wpf #data-binding #textbox #multiline

#c# #wpf #привязка данных #текстовое поле #многострочный

Вопрос:

Я новичок в привязке данных, но у меня запущена простая программа, в которой я привязываю строку данных к текстовому полю. Это работает хорошо, каждый раз, когда строка обновляется, она показывает ее в текстовом поле.

Однако мне нужно, чтобы одно из моих текстовых полей добавляло данные, а не перезаписывало их новой строкой данных. 1. Я знаю, что могу добавить новую строку данных к существующей, но не повлияет ли это на производительность в долгосрочной перспективе, поскольку это приведет к тому, что вся строка будет ограничиваться текстовым полем каждый раз при обновлении? 2. Возможно, у вас есть какие-либо предложения о том, как я могу добиться добавления, не беспокоясь о том, что вся строка копируется в текстовое поле каждый раз, когда оно обновляется?

Эта строка используется для вывода некоторой информации журнала на экран (через элемент управления текстовым полем), и ей суждено стать очень большой.

Надеюсь, что вы сможете помочь или дать несколько предложений.

Ответ №1:

Вы не можете использовать привязку данных WPF для добавления некоторых данных, и вы правы в своем наблюдении, что каждый раз, когда ваша строка журнала обновляется, привязка будет переоцениваться. Это может снизить производительность, если строка станет очень длинной. Могу ли я предложить другой дизайн? Вместо того, чтобы хранить ваш журнал в виде одной строки, почему бы не сохранить его в виде списка отдельных сообщений журнала? Затем вы можете привязать это к списку в вашем пользовательском интерфейсе. При добавлении новых элементов журнала он просто добавит новый элемент в список. Этот дизайн также может использовать преимущества виртуализации пользовательского интерфейса.

Краткий пример кода:

 ObservableCollection<string> logItems = new ObservableCollection<string>();

public ObservableCollection<string> LogItems
{
  get { return _logItems; }
}

// add items as they are logged
public AddToLog(string message)
{
  logItems.Add(message);
}
  

Затем вы можете привязать эту коллекцию сообщений журнала к своему пользовательскому интерфейсу:

 <ListBox x:Name="list" ItemsSource="{Binding LogItems}"/>
  

Или, если вы хотите выполнить привязку в code-behind …

 list.SetBinding(ListBox.ItemsSource, new Binding("LogItems")
{
  Source = this;
});
  

Комментарии:

1. Привет, Колин, спасибо за предложение. Я пробовал это, но это не работает, и я надеюсь, что вы сможете быстро взглянуть. Я раньше не использовал способ привязки xaml, все это делалось в коде, поэтому я немного заблудился. Вот код:

2. хорошо, я не могу добавить код. хе-хе. как мне добавить блок кода, как вы сделали?

3. Вставьте код, а затем отформатируйте его. Но я предполагаю, что раздел комментариев не позволит вам добавлять длинные коды. Вы можете отредактировать свой первоначальный вопрос и добавить туда код.