2016-10-11 122 views
2

考慮有三列下面的DataGrid:WPF的DataGrid禁用小區接收文本輸入

enter image description here

當有史以來年齡爲-1相應的單元格被禁用。

理想情況下,用戶不能更改禁用的單元格值。然而,考慮用戶在第1行,鍵盤焦點在列Age的相應單元格中,並按下回車鍵,現在用戶鍵入任何數字,禁用的單元格獲得該值!這是一個理想的行爲?我怎樣才能避免這種行爲?

enter image description here

要複製問題:

  1. 在年齡欄第1行選擇單元格
  2. 按回車鍵
  3. 鍵入數字

重複性代碼:

XAML:

<Window x:Class="wpf_behaviour.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="DataGridDetailsSample" Height="200" Width="400"> 
    <Grid Margin="10"> 
     <DataGrid Name="dgUsers" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="ID" Binding="{Binding Id}"/> 
       <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
       <DataGridTextColumn Header="Age" Binding="{Binding Age}"> 
        <DataGridTextColumn.CellStyle> 
         <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Age}" Value="-1"> 
            <Setter Property="IsEnabled" Value="False"/> 
            <Setter Property="ToolTip" Value="This filed is diabled."/> 
            <Setter Property="Background" Value="LightGray"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </DataGridTextColumn.CellStyle> 
       </DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

Correspoinding CS:

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Documents; 

namespace wpf_behaviour 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      List<User> users = new List<User>(); 
      users.Add(new User() { Id = 1, Name = "Kumar", Age = 10 }); 
      users.Add(new User() { Id = 2, Name = "Sameer", Age = -1 }); 
      users.Add(new User() { Id = 3, Name = "Danny", Age= 16 }); 

      dgUsers.ItemsSource = users; 
     } 

     public class User 
     { 
      public int Id { get; set; } 
      public string Name { get; set; } 
      public int Age { get; set; } 
     } 
    } 
} 
+0

看看這個帖子http://stackoverflow.com/questions/37584559/datagridcheckboxcolumn -loses-isreadonly-state-when-application-elementstyle –

+0

@ S.Akbari Setting '沒有幫助! – Abbas

回答

0

我不知道爲什麼這happaning但你可以趕上輸入事件並取消編輯:

C#

private void MyDataGrid_OnKeyDown(object sender, KeyEventArgs e) 
{ 
    var dg = sender as DataGrid; 

    // alter this condition for whatever valid keys you want - avoid arrows/tab, etc. 
    if (dg != null && !dg.IsReadOnly && e.Key == Key.Enter) 
    { 
     dg.CancelEdit(); 
     e.Handled = true; 
    } 
} 

XAML

<DataGrid Grid.Column="1" Name="dgUsers" AutoGenerateColumns="False" PreviewKeyDown="MyDataGrid_OnKeyDown"> 
+0

我不想取消所有的'Key.Enter'。並且正在接收谷值的禁用細胞的事件都沒有被觸發。所以我絕對沒有辦法找出接收文本的單元格是否爲禁用單元格。 – Abbas

0

我得到的溶液(加了PreviewKeyDown事件處理函數),就是這樣,我想知道的任何更好的解決方案,以及:

private void DataGridCell_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    try 
    { 
     DataGridCell cl = (DataGridCell)sender; 
     //Get the Cell's parent row 
     //using System.Windows.Media; for VisaualTreeHelper 
     var DataGridRowParent = VisualTreeHelper.GetParent(cl); 
     while (DataGridRowParent != null && DataGridRowParent.GetType() != typeof(DataGridRow)) 
     { 
      DataGridRowParent = VisualTreeHelper.GetParent(DataGridRowParent); 
     } 
     //Get the Row's parent DataGrid 
     var DataGridParent = VisualTreeHelper.GetParent(DataGridRowParent); 
     while (DataGridParent != null && DataGridParent.GetType() != typeof(DataGrid)) 
     { 
      DataGridParent = VisualTreeHelper.GetParent(DataGridParent); 
     } 

     DataGrid dp = DataGridParent as DataGrid; 
     //Get the CurrentCell value of DataGrid 
     DataGridCellInfo cli = dp.CurrentCell; 

     var CellContent = cli.Column.GetCellContent(cli.Item); 
     if (CellContent != null) 
     { 
      //Get DataGridCell of DataGridCellInfo 
      DataGridCell dgc = (DataGridCell)CellContent.Parent; 
      if (dgc.IsEnabled == false) 
      { 
       //If the key pressed is Enter or Tab allow 
       if (e.Key == Key.Enter || e.Key == Key.Tab) 
       { 
        e.Handled = false; 
        return; 
       } 
       //If any other key is pressed don't allow. 
       e.Handled = true; 
       return; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
}