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