Добавление DataTemplate в ListBox (DataTemplateSelector)

353
05 октября 2017, 10:51

Всем доброго времени суток. Пытаюсь сделать окно чата через ListBox , DataTemplate, DataTemplateSelector

Cоответствено есть 2 темплейта

<DataTemplate x:Key="UserMessage" >
<Grid Width="500">
<TextBlock Text="{Binding Message}" FontSize="30" Foreground="Aquamarine" Background="{x:Null}" HorizontalAlignment="Left"></TextBlock>
</Grid>
</DataTemplate>
<DataTemplate x:Key="AssistantMessage" >
<Grid Width="500">
<TextBlock Text="{Binding Message}" FontSize="30" Foreground="White" Background="{x:Null}" HorizontalAlignment="Right"></TextBlock>
</Grid>
</DataTemplate>
 <t:TemplateSelect          
                UserMessage ="{StaticResource UserMessage}"  
                AssistantMessage ="{StaticResource AssistantMessage}"
                x:Key="TS"/>


  class AssistantMessage
    {
        public string Message { get; set; }
    }
   class UserMessage
    {
        public string Message { get; set; }
    }

И класс через который идет выбор Templat`a

class TemplateSelect : DataTemplateSelector
    {
        public DataTemplate UserMessage { get; set; }
        public DataTemplate AssistantMessage { get; set; }

        List<UserMessage> SansData = new List<UserMessage>();
        List<AssistantMessage> WansData = new List<AssistantMessage>();
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            if (item is UserMessage)
            {
                SansData.Clear();
                SansData.Add(new UserMessage()
                {
                   Message = MainVars.UserCommand
                });
                MainWindow.Instance.MainChat.ItemsSource = SansData;
                return UserMessage;
            }
            else if (item is AssistantMessage)
            {
                WansData.Clear();
                WansData.Add(new AssistantMessage()
                {
                   Message = MainVars.AssistantMessage,
                });
                MainWindow.Instance.MainChat.ItemsSource = WansData;
                return AssistantMessage;
            }
            else
            {
                return null;
            }
        }
    }

И добавление в ListBox

{
 TemplateSelect select = new TemplateSelect();
                        AppLogic.AnswerLogic.MessageTemplates.UserMessage UMData = new AppLogic.AnswerLogic.MessageTemplates.UserMessage();
                        AppLogic.AnswerLogic.MessageTemplates.AssistantMessage AMData = new AppLogic.AnswerLogic.MessageTemplates.AssistantMessage();
                        MainVars.UserCommand = null;
                        MainVars.UserCommand = MessageChat.Text;
                        MainVars.CommandToAction = MessageChat.Text.ToLower();
                        MainVars.AssistantMessage = "Сообщение ассистента";
                        select.SelectTemplate(UMData, null);
                        select.SelectTemplate(AMData, null);
}

Как добавлять сообщения чтобы не приходилось удалять все предыдущие? Сделать как в чате.

Answer 1

Вы делаете что-то совсем не то.

Функциональность TemplateSelector'а состоит в том, чтобы по данному элементу определить темплейт для него. Никакого добавления элементов во внешние списки быть не должно. Хуже того, это добавление мешает вашему коду и скорее всего служит источником багов.

Ваш код должен выглядеть как-то так:

class TemplateSelect : DataTemplateSelector
{
    public DataTemplate UserMessageTemplate { get; set; }
    public DataTemplate AssistantMessageTemplate { get; set; }
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is UserMessage)
            return UserMessageTemplate;
        else if (item is AssistantMessage)
            return AssistantMessageTemplate;
        else
            return null;
    }
}
<ListBox ItemsSource="{Binding тут привязка данных}"
         ItemTemplateSelector="{StaticResource TS}" />

И добавление в ListBox должно быть не вручную (мы ж не на WinForms пишем?), а через модификацию данных, к которым привязано свойство ItemsSource.

READ ALSO
Как с помощью Microsoft Bot Framework сделать кнопки в несколько рядов?

Как с помощью Microsoft Bot Framework сделать кнопки в несколько рядов?

Нужно создать несколько рядов keyboard кнопок с разным их количеством в ряду для TelegramКак сделать один ряд понятно, но не пойму как сделать из этого...

247
c# лагает программа при прорисовке

c# лагает программа при прорисовке

Есть программа по типу игры лабиринта, реализована в windows formsНеобходимо сделать так, чтобы не весь лабиринт был виден сразу (как на рисунке)

342
Доступ к event из вне

Доступ к event из вне

Возможно ли дать доступ к event в другой dll?

257
Ошибка ORA-01008: не все переменные привязаны

Ошибка ORA-01008: не все переменные привязаны

Есть проблема с выполнением параметризованного запроса в c#Вот мой код:

321