2013-08-07 3 views
0

В моем приложении Wpf у меня есть два набора данных. DefaultDataTemplate и EditableDataTemplate.WPF: изменение DataTemplate за одно изменение

Xaml:

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


<DataTemplate x:Key="EditableDataTemplate"> 
      <StackPanel Orientation="Horizontal" Width="596"> 
       <!--<ComboBox x:Name="ClientComboBox" SelectionChanged="ClientComboBoxChanged" 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 ClientNameBinding,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="145"/> 
       <TextBox Text="{Binding ApplicationNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="90"/> 
       <xctk:TimePicker Name="StartPicker" Value="{Binding StartValue, ElementName=MainWin, UpdateSourceTrigger=PropertyChanged}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="100" EndTime="11:59:0"/> 
       <xctk:TimePicker Name="EndPicker" Value="{Binding EndValue, ElementName=MainWin, UpdateSourceTrigger=PropertyChanged}" Format="Custom" FormatString="hh:mm tt" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" Width="60" EndTime="11:59:0"/> 
       <TextBox Text="{Binding TaskNameBinding}" Background="Yellow" Padding="0" Margin="0" BorderThickness="0" TextWrapping="Wrap" Width="71"/> 
       <ComboBox x:Name="ProjectComboBox" ItemsSource="{Binding Path=projectList, ElementName=MainWin}" SelectedValuePath="_id" DisplayMemberPath="_name" SelectedItem="{Binding ProjectNameBindingClass, Mode=OneWayToSource}" Width="130" Background="Yellow" BorderThickness="0"/> 
      </StackPanel> 
     </DataTemplate> 

В следующем коде, я пытаюсь изменить DataTemplate, так что я могу редактировать существующие записи данных из списка. В соответствии с приведенным ниже кодом, когда я перехожу из DefaultDataTemplate в EditableDataTemplate, я могу редактировать все записи, потому что все записи в режиме редактирования. После редактирования, когда я снова нажимаю кнопку, я просто хочу опубликовать эту запись, которую я изменил (чей текст был изменен/обновлен). Но проблема в том, что при нажатии кнопки все записи публикуются в веб-учетной записи, с которой я связан.

C#:

private void EditButton_Click(object sender, RoutedEventArgs e) 
    { 
     foreach (Harvest_TimeSheetEntry item in listBox1.Items) 
     { 
      if (item.isSynced) 
      { 
       item.isSynced = false; 
       listBox1.ItemTemplate = (DataTemplate)this.FindResource("EditableDataTemplate"); 
       this.EditButton.Content = "Done Editing"; 
      } 
      else 
      { 
       listBox1.ItemTemplate = (DataTemplate)this.FindResource("DefaultDataTemplate"); 
       this.EditButton.Content = "Edit"; 
       Globals._globalController.harvestManager.postHarvestEntry(item); 
       System.Windows.MessageBox.Show("Entry posted"); 
      } 
     } 
    } 

Ниже строки используется для размещения записи в Web

счет-
Globals._globalController.harvestManager.postHarvestEntry(item); 

Пожалуйста, предложите что-то, как я должен поступить?

ответ

0

Вы можете добавить в класс Harvest_TimeSheetEntry свойство «DirtyFlag», которое указывает, что было изменено хотя бы одно значение.

public class Harvest_TimeSheetEntry 
{ 
    public bool DirtyFlag {get; private set;} 

    public void Reset() 
    { 
     DirtyFlag = false; 
    } 

    public DateTime StartValue 
    { 
     get { return _startValue; } 
     set 
     { 
      _startValue = value; 
      // in each of the modifyable Properties add this 
      DirtyFlag = true; 
     } 
    } 

    (...) 
} 

В вашей кнопки обработчик событий вы проверяете, то для этого флага:

private void EditButton_Click(object sender, RoutedEventArgs e) 
{ 
    foreach (Harvest_TimeSheetEntry item in listBox1.Items) 
    { 
     if (item.isSynced) 
     { 
      item.Reset(); 

      item.isSynced = false; 
      listBox1.ItemTemplate = (DataTemplate)this.FindResource("EditableDataTemplate"); 
      this.EditButton.Content = "Done Editing"; 
     } 
     else 
     { 
      listBox1.ItemTemplate = (DataTemplate)this.FindResource("DefaultDataTemplate"); 
      this.EditButton.Content = "Edit"; 
      if(item.DirtyFlag) 
      { 
       Globals._globalController.harvestManager.postHarvestEntry(item); 
       item.Reset(); 
       System.Windows.MessageBox.Show("Entry posted"); 
      } 
     } 
    } 
} 
Смежные вопросы