Всем доброго времени суток. Пытаюсь сделать окно чата через 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);
}
Как добавлять сообщения чтобы не приходилось удалять все предыдущие? Сделать как в чате.
Вы делаете что-то совсем не то.
Функциональность 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.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости