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);
     }

还有我所拥有的。没有我的留言,只有很多答案。

http://imgur.com/a/F3eIy

无法理解我必须做什么。

现在我这样做了

 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 没有改变。您获得的项目比您预期的要多,因为您在选择器中添加了更多项目。