2017-10-06 65 views
0

我有一个DataGrid绑定到ObservableCollection,用户可以添加/删除行。在第一列中,当用户双击单元格时,会出现一个新窗口,但是直到他离开单元格然后重新输入它才会发生。 调试完成后,我发现DataGridTextColumn直到第二次双击才得到初始化。 我的绑定有什么问题?如何绑定新行甚至添加到ObservableCollection项目

XAML:

<Window.Resources> 
    <Style TargetType="DataGridCell"> 
     <EventSetter Event="MouseDoubleClick" Handler="CellDoubleClick"/> 
    </Style> 
</Window.Resources> 

<DataGrid x:Name="TeachersDataGrid" ItemsSource="{Binding TeacherInfoList, IsAsync=True}" FlowDirection="RightToLeft" Canvas.Left="104" Canvas.Top="18" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" Background="#FFEEECEC"> 
<DataGrid.Columns> 
    <DataGridTextColumn Header="الرقم" Binding="{Binding Path=Num, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataGridTextColumn Header="لقب الموظف و إسمه" IsReadOnly="True" Binding="{Binding Path=FullName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataGridTextColumn Header="مهنته" IsReadOnly="True" Binding="{Binding Path=CurrentStatus, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataGridTextColumn Header="المؤسسة أو مكان العمل" IsReadOnly="True" Binding="{Binding Path=SchoolName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataGridTextColumn Header="الولاية" IsReadOnly="True" Binding="{Binding Path=Province, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    <DataGridTextColumn Header="طبيعة التفتيش" Binding="{Binding Path=Notes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</DataGrid.Columns> 

C#:

private void CellDoubleClick(object sender, RoutedEventArgs e) 
{ 
    DataGridCell cell = null; 
    TextBox textBox = null; 

    cell = sender as DataGridCell; 
    if (cell == null) 
    //if (cell == null || (cell.Column.DisplayIndex == 0 || cell.Column.DisplayIndex == 5)) 
     { 
     return; 
    } 

    MessageBox.Show("cell66"); 
    DataGridRow row = DataGridRow.GetRowContainingElement(cell); 
    int rowIndex = row.GetIndex(); 
    //MessageBox.Show(rowIndex.ToString()); 
    textBox = cell.Content as TextBox; 
    if (textBox == null) 
    { 
     return; 
    } 

    MessageBox.Show("textBox"); 
    try 
    { 
     TeachersListWindow TeachersListW = new TeachersListWindow(this, rowIndex); 
     TeachersListW.Show(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

回答

0

这里有一个竞争条件。 由于DataGrid不是只读的,因此当您双击一个单元格时,它将其DataTemplate从Display模板更改为Edit模板。

在DataGridTextColumn的Display DataTemplate中,只有TextBlock元素。

在编辑DataGridTextColumn的DataTemplate中有TextBox元素。

您将遇到像这样捕获TextBox元素的麻烦。

更好的选择是在行上使用doubleclick事件处理函数,并使用它的DataContext来提取所需的数据。

+0

一个简单的代码片段会很棒。 –

相关问题