2017-10-26 16 views
0

私は2つの読み取り専用DataGridTextColumnsと1つのDataGridTemplateColumnとそれにTextBoxを持つDataGridを持っています。 (私がテキスト列ではなくテキストボックスに行ったのは、各データグリッド行にコンテキストメニューを表示して名前を変更して、このアプローチで最も簡単なものになったからです)。WPF:DataGridコンテンツの変更に対応する最善の方法は?

 <DataGrid Grid.Row="0" Name="dgUsers" AutoGenerateColumns="False" ItemsSource="{Binding Path=Users, Mode=TwoWay}"> 
      <DataGrid.RowStyle> 
       <Style TargetType="{x:Type DataGridRow}"> 
        <Setter Property="ContextMenu" Value="{StaticResource dataGridRowContextMenu}" /> 
       </Style> 
      </DataGrid.RowStyle> 
      <DataGrid.Columns> 

       <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True" /> 

       <DataGridTemplateColumn Width="Auto" Header="Middle Name"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox Name="middleName" Text="{Binding MiddleName}" Style="{StaticResource DataGridTextBox}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

       <DataGridTextColumn Header="Last Name" Binding="{Binding LastName}" IsReadOnly="True"/> 


      </DataGrid.Columns> 
     </DataGrid> 

データグリッドの内容は、ビューモデル内のオブジェクトのコレクションに2回バインドされます。各行はユーザーに対応します。私のビューモデルのそれらのUsersオブジェクトは、データベースに接続されます。私は、ユーザーが編集可能な列(各行がテキストボックスを持つ列)のテキストを変更すると、データベースがそれに応じて変更されるようにしたいと考えています。

私の質問は、テンプレート列の変更をリッスンしてそれに反応する優れたMVVMの方法は何ですか?理想的に私は方法をしたい...

    <DataGridTemplateColumn Width="Auto" Header="Middle Name"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox Name="middleName" Text="{Binding MiddleName}" Style="{StaticResource DataGridTextBox}" 
            TextChanged="middleName_TextChanged"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 

しかし、その後の背後にあるすべての文字に呼び出されます私のxaml.csコードでmiddleName_TextChanged()メソッドは、テキストボックスに追加:

私はTextChangedイベントを使用してみましたフォーカスがテキストボックスを離れるときにのみ呼び出されます(すべての文字が追加されているわけではありません)。

また、この列がバインドされているUserプロパティのsetメソッド(User.MiddleNameのsetメソッド)から入力検証を行う方法も検討しましたが、これもテキストに挿入された各文字とともに呼び出されますボックス。あなたの.xamlファイルで

答えて

0

CollectionViewSource

このよう
<Window.Resources> 
     <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/> 
</Window.Resources> 

を追加してからDataGridに背後ItemCollectionViewSourceにデータベースを設定するコードで今、この

DataContext="{StaticResource ItemCollectionViewSource}" 

ようItemCollectionViewSourceDataContextを置きますこのように

CollectionViewSource itemCollectionViewSource; 
itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource")); 
itemCollectionViewSource.Source = YourDataBase; 

twowayバインディングの変更は、データベースに反映されます。

+0

これは理想的なソリューションのようです。どうもありがとうございました。しかし、データグリッドと実際にデータベースを更新する間には、多くのステップと多くのレイヤーが必要です。私はデータベースをグリッドに直接バインドしたくない。 私が探しているのは、データグリッド行の内容が変更されたとき(各文字が追加された後ではなく、テキストボックスがフォーカスを失ってテキストが変更されたとき)に呼び出される関数です。この関数は、この変更が行われた行と新しい内容が何であるかを知る必要があります。 – MRueda

+0

私はデフォルトで 'TextBox'はフォーカスが失われたときにデータベースを更新するだけで、文字が変更されていないときは更新しないと思います。したがって、あなたは私が言及した方法を使うことができます。 – VegaBrothers

関連する問題