2016-09-22 3 views
-2

DataTemplateSelector와 함께 datatemplates를 사용하려고합니다. 프로그램이 실행되는 동안 가지고있는 2 개의 템플릿 중 1 개를 선택하고 싶습니다.DataTemplateSelector ListView에 항목을 추가하지 마십시오.

그래서 나는이 간단한 템플릿이 있습니다

<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"/> 

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

    } 

가 그럼 난 "안녕하세요"를 입력하고

 public void AnswersADD() 
    { 
      MainLogic.MainVars.TemplateType = 1; 
      add.SelectTemplate(null, null); 

      MainLogic.MainVars.TemplateType = 2; 
      add.SelectTemplate(null, null); 
    } 
SendButton을 클릭

<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> 

그리고 코드 목록보기

그리고 내가 가지고있는 것. 내 메시지가없고 오직 많은 답이 있습니다.

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; 
+0

오류 또는 메시지가 있습니까? 또한 switch 문 바로 앞에 중단 점을 넣으면 어떻게됩니까? 네가 한걸음 나아 간다면 너는 기대 한대로 할 수 있니? – Joe

+1

DataTemplateSelector는 항목이 사용 된 ItemsSource에 항목을 추가하기위한 것이 아닙니다. 'MainWindow.Instance.MainChat.Items.Add (...)'를 호출하지 마십시오. – Clemens

+0

MainWindow.Instance.MainChat.Items.Add (...)를 호출하지 않으면 아무 일도 일어나지 않습니다. –

답변

0

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가 변경되지 않기 때문에 모두 같은 템플릿의 항목을 얻고있다. 선택자에서 더 많은 항목을 추가하기 때문에 예상보다 많은 항목이 표시됩니다.

+0

MainLogic.MainVars.TemplateType은 간단합니다. int var –

+0

예. 이제 내 메시지를 추가하지만 2 개의 서클이 있습니다. MainChat.Items.Add()를 호출하지 않으면 아무 일도 일어나지 않습니다.항목을 추가하는 방법을 모르겠 음 –

+0

ItemsSource = "{Binding MessagesAdd}"는 내용을 설정합니다. 목록 뷰를 바인딩 한 메시지 추가 메시지에 항목을 추가합니다. 템플릿 섹터와 템플릿 하나없이 작업을 수행하도록 제안한 다음 해당 작업을 수행 할 때 선택기를 추가하는 것이 좋습니다. – Joe