2013-08-07 35 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"); 
      } 
     } 
    } 

以下行用于发布进入网络帐户 -

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