2013-07-01 2 views
2

내 wpf 응용 프로그램에는 ListBox가있는 View 클래스가 있습니다.하나의 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 코드 :

경우 내가 해당 항목 내 수확 account.Here에 게시됩니다 모든 목록 상자의 항목을 더블 클릭옵니다 Item.so의 더블 클릭 이벤트에 대한 코드를 작성하다
<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에서 클라이언트 및 프로젝트를 선택하고 항목을 두 번 클릭하면 내 계정에 게시되지만 해당 시간에 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 값에 따라 표시 여부를 전환 할 수 있습니다.

그런데 DoubleClick-eventhandler에서 ListBox.SelectedItem 속성을 사용하면 먼저 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 또는 DependencyProperties를 사용하여 구현해야합니다. 그렇지 않으면 해당 값의 변경 사항이 UI에 자동으로 적용되지 않습니다. –