2013-07-01 5 views
2

В моем приложении wpf есть класс View, в котором у меня есть ListBox. Я написал код для двоеборья кнопкой мыши ListBox Item.so, когда я дважды щелкните на любом поле списка элемент, который будет вывешен в моем Harvest account.Here это событие:Переключение с одного DataTemplate на другое

private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     //Submit clicked Entry 
     try 
     { 
      ListBoxItem item = (ListBoxItem)sender; 
      Harvest_TimeSheetEntry entryToPost = (Harvest_TimeSheetEntry)item.DataContext; 

      if (!entryToPost.isSynced) 
      { 
       //Check if something is selected in selectedProjectItem For that item 
       if (entryToPost.ProjectNameBinding == "Select Project" && entryToPost.ClientNameBinding == "Select Client") 
        MessageBox.Show("Please select you Project and Client"); 
       else 
        Globals._globalController.harvestManager.postHarvestEntry(entryToPost); 
        MessageBox.Show("Entry posted"); 
      } 
      else 
      { 

       //Already synced.. Make a noise or something 
       MessageBox.Show("Already Synced;TODO Play a Sound Instead"); 
      } 

     } 
     catch (Exception) 
     { } 
    } 

Мой XAML код:

<DataTemplate x:Key="DefaultDataTemplate"> 
      <StackPanel Orientation="Horizontal" Width="596"> 
       <TextBox Text="{Binding ClientNameBinding}" Background="Transparent" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="145"/> 
       <TextBox Text="{Binding ApplicationNameBinding}" Background="Transparent" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/> 
       <TextBox Text="{Binding StartTimeBinding}" Background="Transparent" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="100"/> 
       <TextBox Text="{Binding StopTimeBinding}" Background="Transparent" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="60"/> 
       <TextBox Text="{Binding ProjectNameBinding}" Background="Transparent" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="130"/> 
       <TextBox Text="{Binding TaskNameBinding}" Background="Transparent" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="71"/> 
      </StackPanel> 
     </DataTemplate> 

     <!-- Editable DataTemplate --> 
     <DataTemplate x:Key="EditableDataTemplate"> 
       <StackPanel Orientation="Horizontal" Width="596"> 
       <ComboBox x:Name="ClientComboBox" SelectionChanged="ProjectComboBoxChanged" ItemsSource="{Binding Path=clientList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name" SelectedItem="{Binding ClientNameBindingClass, Mode=OneWayToSource}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="145"/> 
       <TextBox Text="{Binding ApplicationNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/> 
       <TextBox Text="{Binding StartTimeBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="100"/> 
       <TextBox Text="{Binding StopTimeBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="60"/> 
       <TextBox Text="{Binding TaskNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="130"/> 
       <ComboBox x:Name="ProjectComboBox" SelectionChanged="ProjectComboBoxChanged" ItemsSource="{Binding Path=projectList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name" SelectedItem="{Binding ProjectNameBindingClass, Mode=OneWayToSource}" Width="71" Background="Yellow" BorderThickness="0"/> 
      </StackPanel> 
     </DataTemplate> 




     <!-- DataTemplate Selector --> 

     <l:DayViewListDataTemplateSelector x:Key="templateSelector" 
      DefaultDataTemplate="{StaticResource DefaultDataTemplate}" 
      EditableDataTemplate="{StaticResource EditableDataTemplate}"/> 

У меня есть таймер в моем классе, который генерирует этот EditableDataTemplate с двумя comboBoxes. Моя проблема заключается в том, что когда я выбираю Client и Project в ComboBoxes и дважды щелкаю по этой записи, она публикуется в моей учетной записи, но в то время я хочу, чтобы она конвертировалась из editableDataTemplate в DefaultDataTemplate (т. Е. Эти два combobox должны стать текстовыми полями аналогично DefaultDataTemplate). Как я должен достичь этого результата?

+2

Вы проверили DataTemplateSelector? [Учебник WPF - Как использовать DataTemplateSelector] (http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector) – sll

+0

@sll, вероятно, вы должны написать это в ответе. – zmbq

+0

Да. Я проверил. Я просто хочу конвертировать в тот момент, когда я дважды нажимаю на эту запись. – Dinesh

ответ

0

Я не думаю, что DataTemplateSelector предлагает метод изменения шаблона данных по запросу, он просто используется для выбора разных шаблонов для разных типов данных (а не состояний данных). Я думаю, что лучше всего было бы добавить свойство, позвонив ему в IsInEditMode, в вашу модель данных. Затем вы можете добавить TextBlock и Combobox к вашему шаблону данных и переключить их видимость в соответствии со значением IsInEditMode.

К слову: если вы используете свойство ListBox.SelectedItem в вашем обработчике событий DoubleClick, вы можете напрямую получить доступ к элементу модели данных, не предварительно получить ListBoxItem, а затем получить доступ к его контексту данных .

private void listBox1_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    //Submit clicked Entry 
    try 
    { 
     if(listBox1.SelectedItem is Harvest_TimeSheetEntry) 
     { 
      Harvest_TimeSheetEntry entryToPost = (Harvest_TimeSheetEntry)listBox1.SelectedItem; 

      if (!entryToPost.isSynced) 
      { 
       //Check if something is selected in selectedProjectItem For that item 
       if (entryToPost.ProjectNameBinding == "Select Project" && entryToPost.ClientNameBinding == "Select Client") 
        MessageBox.Show("Please select you Project and Client"); 
       else 
        Globals._globalController.harvestManager.postHarvestEntry(entryToPost); 
        MessageBox.Show("Entry posted"); 

        entryToPost.IsInEditMode = true; //set edit mode! 
      } 
     } 
     else 
     { 

      //Already synced.. Make a noise or something 
      MessageBox.Show("Already Synced;TODO Play a Sound Instead"); 
     } 

    } 
    catch (Exception) 
    { } 
} 
+0

Я пробовал ваш метод, но, когда я дважды нажимаю на элемент listBox, записи сохраняются в этом объекте-отправителе. И мы не можем принимать записи listBox непосредственно в любой объект класса. Сейчас это работает нормально. Проблема заключается в переключении только DataTemplates. – Dinesh

+0

Вы пробовали добавить дополнительную собственность, поэтому вам не придется переключаться с шаблоном? Не забудьте использовать свойства INotifyPropertyChanged или Dependency для его реализации, поскольку в противном случае изменения его значения не будут автоматически применяться к пользовательскому интерфейсу. –

Смежные вопросы