DataTemplateSelector 不要在 ListView 中添加项目
DataTemplateSelector dont add items in ListView
我正在尝试将数据模板与 DataTemplateSelector 一起使用。我想选择我拥有的 2 个模板中的 1 个,而程序是 运行.
所以我有 2 个简单模板:
<DataTemplate x:Key="User_Text_Message">
<StackPanel>
<TextBlock Text="{Binding UsCom}" Foreground="Black"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="Anastasia_Text_Message">
<StackPanel>
<TextBlock Text="{Binding Answer}" Foreground="Yellow"/>
</StackPanel>
</DataTemplate>
<t:MessagesAdd
User_Text_Message="{StaticResource User_Text_Message}"
Anastasia_Text_Message="{StaticResource Anastasia_Text_Message}"
x:Key="MessAdd"/>
一个列表视图
<ListView x:Name="MainChat" Height="330" Background="{x:Null}"
Margin="10,25,0,10" HorizontalAlignment="Left"
Width="680" Foreground="White" ItemTemplateSelector="{StaticResource MessAdd}"
ItemsSource="{Binding MessagesAdd}">
</ListView>
和代码
class MessagesAdd : DataTemplateSelector
{
public DataTemplate Anastasia_Text_Message { get; set; }
public DataTemplate User_Text_Message { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
switch(MainLogic.MainVars.TemplateType)
{
case 1:
var g = new UserTextCommand() { UsCom = MainLogic.MainVars.UserCommand };
MainWindow.Instance.MainChat.Items.Add(g);
return User_Text_Message;
case 2:
var a = new AnastasiaTextAnswer() { Answer = MainLogic.MainVars.AnastasiaAnswer };
MainWindow.Instance.MainChat.Items.Add(a);
return Anastasia_Text_Message;
default:
return null;
}
}
}
class UserTextCommand
{
public string UsCom { get; set; }
}
class AnastasiaTextAnswer
{
public string Answer { get; set; }
}
然后我输入 "Hello" 并单击 SendButton
public void AnswersADD()
{
MainLogic.MainVars.TemplateType = 1;
add.SelectTemplate(null, null);
MainLogic.MainVars.TemplateType = 2;
add.SelectTemplate(null, null);
}
还有我所拥有的。没有我的留言,只有很多答案。
无法理解我必须做什么。
现在我这样做了
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
ObservableCollection<AnswersLogic.AnastasiaTextAnswer> answer = new ObservableCollection<AnswersLogic.AnastasiaTextAnswer>();
ObservableCollection<AnswersLogic.UserTextCommand> usercom = new ObservableCollection<AnswersLogic.UserTextCommand>();
if (item is UserTextCommand)
{
usercom.Add(new UserTextCommand() { UsCom = MainLogic.MainVars.UserCommand});
MainWindow.Instance.MainChat.ItemsSource = usercom;
return User_Text_Message;
}
else if (item is AnastasiaTextAnswer)
{
answer.Add(new AnastasiaTextAnswer() { Answer = MainLogic.MainVars.AnastasiaAnswer });
MainWindow.Instance.MainChat.ItemsSource = answer;
return Anastasia_Text_Message;
}
else
{
return null;
}
}
}
但是
里面有无限圆
MainWindow.Instance.MainChat.ItemsSource = usercom;
和
MainWindow.Instance.MainChat.ItemsSource = answer;
什么是MainLogic.MainVars.TemplateType?根据传递给 SelectTemplate 方法的项目,我看不出会有什么不同。另外,我不确定您为什么要在此选择器中添加内容。它应该提供一个模板,仅此而已。像这样:
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is UserTextCommand)
{
return User_Text_Message;
}
else if (item is AnastasiaTextAnswer)
{
return Anastasia_Text_Message;
}
else
{
return null;
}
}
您正在获取所有相同模板的项目,因为 MainLogic.MainVars.TemplateType 没有改变。您获得的项目比您预期的要多,因为您在选择器中添加了更多项目。
我正在尝试将数据模板与 DataTemplateSelector 一起使用。我想选择我拥有的 2 个模板中的 1 个,而程序是 运行.
所以我有 2 个简单模板:
<DataTemplate x:Key="User_Text_Message">
<StackPanel>
<TextBlock Text="{Binding UsCom}" Foreground="Black"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="Anastasia_Text_Message">
<StackPanel>
<TextBlock Text="{Binding Answer}" Foreground="Yellow"/>
</StackPanel>
</DataTemplate>
<t:MessagesAdd
User_Text_Message="{StaticResource User_Text_Message}"
Anastasia_Text_Message="{StaticResource Anastasia_Text_Message}"
x:Key="MessAdd"/>
一个列表视图
<ListView x:Name="MainChat" Height="330" Background="{x:Null}"
Margin="10,25,0,10" HorizontalAlignment="Left"
Width="680" Foreground="White" ItemTemplateSelector="{StaticResource MessAdd}"
ItemsSource="{Binding MessagesAdd}">
</ListView>
和代码
class MessagesAdd : DataTemplateSelector
{
public DataTemplate Anastasia_Text_Message { get; set; }
public DataTemplate User_Text_Message { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
switch(MainLogic.MainVars.TemplateType)
{
case 1:
var g = new UserTextCommand() { UsCom = MainLogic.MainVars.UserCommand };
MainWindow.Instance.MainChat.Items.Add(g);
return User_Text_Message;
case 2:
var a = new AnastasiaTextAnswer() { Answer = MainLogic.MainVars.AnastasiaAnswer };
MainWindow.Instance.MainChat.Items.Add(a);
return Anastasia_Text_Message;
default:
return null;
}
}
}
class UserTextCommand
{
public string UsCom { get; set; }
}
class AnastasiaTextAnswer
{
public string Answer { get; set; }
}
然后我输入 "Hello" 并单击 SendButton
public void AnswersADD()
{
MainLogic.MainVars.TemplateType = 1;
add.SelectTemplate(null, null);
MainLogic.MainVars.TemplateType = 2;
add.SelectTemplate(null, null);
}
还有我所拥有的。没有我的留言,只有很多答案。
无法理解我必须做什么。
现在我这样做了
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
ObservableCollection<AnswersLogic.AnastasiaTextAnswer> answer = new ObservableCollection<AnswersLogic.AnastasiaTextAnswer>();
ObservableCollection<AnswersLogic.UserTextCommand> usercom = new ObservableCollection<AnswersLogic.UserTextCommand>();
if (item is UserTextCommand)
{
usercom.Add(new UserTextCommand() { UsCom = MainLogic.MainVars.UserCommand});
MainWindow.Instance.MainChat.ItemsSource = usercom;
return User_Text_Message;
}
else if (item is AnastasiaTextAnswer)
{
answer.Add(new AnastasiaTextAnswer() { Answer = MainLogic.MainVars.AnastasiaAnswer });
MainWindow.Instance.MainChat.ItemsSource = answer;
return Anastasia_Text_Message;
}
else
{
return null;
}
}
}
但是
里面有无限圆 MainWindow.Instance.MainChat.ItemsSource = usercom;
和
MainWindow.Instance.MainChat.ItemsSource = answer;
什么是MainLogic.MainVars.TemplateType?根据传递给 SelectTemplate 方法的项目,我看不出会有什么不同。另外,我不确定您为什么要在此选择器中添加内容。它应该提供一个模板,仅此而已。像这样:
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is UserTextCommand)
{
return User_Text_Message;
}
else if (item is AnastasiaTextAnswer)
{
return Anastasia_Text_Message;
}
else
{
return null;
}
}
您正在获取所有相同模板的项目,因为 MainLogic.MainVars.TemplateType 没有改变。您获得的项目比您预期的要多,因为您在选择器中添加了更多项目。