2016-03-15 59 views
0

我在DataGrid中可編輯單元格,我需要創建「撤消更改」按鈕,設置原值細胞的TextBlock的意外行爲在DataGridCell內的TextBlock(文本框)後,「撤銷更改」

My DataGrid

我改變顏色變化值的TextBlock的 I change color after changing value of TextBlock

點擊 「撤消更改」 按鈕 Clicking "undo changes" button

現在有預計Now there is expected value

但AFTE後[R單擊單元格,有意外」 值 But after clicking on cell, there is "new" value

Unexpected "new" value

有沒有可能性DataGridCell有兩個不同的TextBlocks(或文本框)?如果是這樣,爲什麼有可能,其中一個重寫另一個?

這裏是我的代碼部分,我做「撤消更改」

private void ContextMenuDeleteItemClick(object sender, RoutedEventArgs e) 
{ 
    var cellInfo = this.CurrentCell; 
    this.ScrollIntoView(cellInfo.Item); 
    var row = this.ItemContainerGenerator.ContainerFromItem(cellInfo.Item) as DataGridRow; 
    if (row != null) 
    { 
    FrameworkElement element = cellInfo.Column.GetCellContent(cellInfo.Item); 
    KeyValuePair<DataGridColumn, DataGridRow> key = new KeyValuePair<DataGridColumn, DataGridRow>(cellInfo.Column, row); 
    if (originalCellValues.ContainsKey(key)) 
    { 
     ((element.Parent as DataGridCell).Content as TextBlock).Text = originalCellValues[key]; 
     (element.Parent as DataGridCell).Style = (element.Parent as DataGridCell).Column.CellStyle; 
    } 
    } 
} 

當我試圖抓住這一行爲同時調試,我OnBeginningEdit值都很好,然後突然在OnCellEditEnding值是意外

在我OnBeginningEdit我保存原始值

protected override void OnBeginningEdit(DataGridBeginningEditEventArgs e) 
{ 
    if (!this.editableColumns[e.Column.DisplayIndex]) 
    { 
    if (!e.Row.IsNewItem) 
    { 
     e.Cancel = true; 
    } 
    } 

    FrameworkElement element = e.Column.GetCellContent(e.Row); 
    KeyValuePair<DataGridColumn, DataGridRow> key = new KeyValuePair<DataGridColumn, DataGridRow>(e.Column, e.Row); 
    if (!originalCellValues.ContainsKey(key)) 
    { 
    originalCellValues.Add(key, ((element.Parent as DataGridCell).Content as TextBlock).Text); 
    } 
} 

在我OnCellEditEnding我更改單元格的風格 - 一個色彩單元,如果它被編輯

protected override void OnCellEditEnding(DataGridCellEditEndingEventArgs e) 
{ 
    if ((e.EditingElement as TextBox).Text != originalCellValues[new KeyValuePair<DataGridColumn, DataGridRow>(e.Column, e.Row)]) 
    { 
    FrameworkElement element = e.Column.GetCellContent(e.Row); 
    (element.Parent as DataGridCell).Style = CreateStyle("RequiredColor", e.Column.CellStyle); 
    } 
    else 
    { 
    FrameworkElement element = e.Column.GetCellContent(e.Row); 
    (element.Parent as DataGridCell).Style = e.Column.CellStyle; 
    } 
} 

回答

0

我找到了解決辦法。我添加了Mode = TwoWay,其中我綁定了TextBlock值上的屬性。它的行爲默認是TwoWay,但在這種情況下不是。真的很奇怪的行爲。

<Controls:FilterableDataGrid Grid.Row="1" 
        ItemsSource="{Binding GarantList, UpdateSourceTrigger=PropertyChanged}" 
        AutoGenerateColumns="False" 
        CanUserAddRows="True" 
        CanUserDeleteRows="True" 
        CanUserReorderColumns="True" 
        CanUserResizeColumns="True" 
        CanUserResizeRows="False" 
        CanUserSortColumns="True" 
        HeadersVisibility="Column" 
        SelectionUnit="CellOrRowHeader" 
        SelectedRow="{Binding ActualRow, Mode=TwoWay}" 
        ScrollViewer.CanContentScroll="True" 
        AlternatingRowBackground="{StaticResource AlternatingRowBackground}" 
        UserContextMenu="{Binding DataGridContextMenu}" 
        IsSaveChanges="{Binding IsSaveChanges, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"> 
      <Controls:FilterableDataGrid.Columns> 
       <DataGridTemplateColumn x:Name="Column1" Width="{StaticResource CheckColumnWidth}" Header="{x:Static localization:Resources.Label_ColumnCheck}" CellStyle="{StaticResource CheckColumnStyle}"/> 
       <Controls:DataGridTextColumn x:Name="Column2" Header="{x:Static localization:Resources.Label_Identifikace}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource C_SPStyle}" Binding="{Binding GEx}" SortMemberPath="GEx" IsEditable="False" /> 
       <Controls:DataGridTextColumn x:Name="Column3" Header="{x:Static localization:Resources.Label_IndAktiv}" Width="{StaticResource IndicationColumnWidth}" CellStyle="{StaticResource IndicationColumnStyle}" Binding="{Binding IndAktiv}" IsEditable="True" /> 
       <Controls:DataGridTextColumn x:Name="Column4" Header="{x:Static localization:Resources.Label_Jmeno}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource ShortTextColumnStyle}" Binding="{Binding JmenoUz, Mode=TwoWay}" IsEditable="True" /> 
       <Controls:DataGridTextColumn x:Name="Column5" Header="{x:Static localization:Resources.Label_Telefon}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource ShortTextColumnStyle}" Binding="{Binding TlfUz, Mode=TwoWay}" IsEditable="True" /> 
       <Controls:DataGridTextColumn x:Name="Column6" Header="{x:Static localization:Resources.Label_Mobil}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource ShortTextColumnStyle}" Binding="{Binding MobilUz}" IsEditable="True" /> 
       <Controls:DataGridTextColumn x:Name="Column7" Header="{x:Static localization:Resources.Label_Mail}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource ShortTextColumnStyle}" Binding="{Binding MailUz}" IsEditable="True" /> 
       <Controls:DataGridTextColumn x:Name="Column8" Header="{x:Static localization:Resources.Label_PristupovaUroven}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource ShortTextColumnStyle}" Binding="{Binding CPu}" IsEditable="True" /> 
      </Controls:FilterableDataGrid.Columns> 
      </Controls:FilterableDataGrid> 

在這裏,在綁定:

<Controls:DataGridTextColumn x:Name="Column5" Header="{x:Static localization:Resources.Label_Telefon}" Width="{StaticResource ShortTextColumnWidth}" CellStyle="{StaticResource ShortTextColumnStyle}" Binding="{Binding TlfUz, Mode=TwoWay}" IsEditable="True" />