2017-10-06 4 views
0

私はをObservableCollectionにバインドしているため、ユーザーは行を追加/削除できます。最初の列で、ユーザーがセルをダブルクリックすると、新しいウィンドウが表示されますが、セルから出て再入力するまでは表示されません。 デバッグ後、DataGridTextColumnが2回目のダブルクリックまで初期化されないという問題が見つかりました。 私のバインディングに間違いはありますか?新しいrowAddを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 templateからEditテンプレートに変更されます。

DataGridTextColumnのDataTemplateを表示すると、TextBlock要素のみが表示されます。

DataGridTextColumnのEdit DataTemplateには、TextBox要素があります。

このようなTextBox要素をキャッチするのに問題があります。

より良いオプションは、行にdoubleclickイベントハンドラを置き、DataContextを使用して必要なデータを抽出することです。

+0

シンプルなスニペットコードは素晴らしいでしょう。 –

関連する問題