none
DataGridの一括検証 RRS feed

  • 質問

  • DataGridをValidationRulesを使用してLostFocus時ではなく
    更新時に一括検証したいのですが上手くいきません。

    .Net Frameworkは3.5 SP1
    WPFToolkitはVisual Stdio 2008に含まれていたもので3.5.40128.1、ランタイムバージョン v2.0.50727

    です。

    dataGrid1には以下のようにデータテーブルをバインドしています
    dataGrid1.DataContext = customerDS.Customer;

    XAMLファイルの記述
    <my:DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" Name="dataGrid1">
      <my:DataGrid.BindingGroup>
      <BindingGroup NotifyOnValidationError="True">
        <BindingGroup.ValidationRules></BindingGroup.ValidationRules>
      </BindingGroup>
      </my:DataGrid.BindingGroup>
      <my:DataGrid.Columns>
        <my:DataGridTemplateColumn Width="250" Header="名称" >
          <my:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
              <TextBox>
                <Binding Path="name" Mode="TwoWay" UpdateSourceTrigger="Explicit">
                  <Binding.ValidationRules>
                    <validate:RequireRule Message="名称" />
                  </Binding.ValidationRules>
                </Binding>
              </TextBox>
            </DataTemplate>
          </my:DataGridTemplateColumn.CellTemplate>
        </my:DataGridTemplateColumn>
             --------------  以下省力 --------------

    上記の<validate:RequireRule Message="名称" />はValidationRuleを継承した
    自作の検証クラスです。

    更新ボタンクリック時のイベントハンドラ
    private void update_Click(object sender, RoutedEventArgs e)
    {
      foreach (BindingExpressionBase value in dataGrid1.BindingGroup.BindingExpressions)
      {
        value.UpdateSource();
      }

      if (!n_board_node.BindingGroup.CommitEdit())
      {
        return;
      }

    通常のコントロールをGridに張り付けた場合は上記と同様のコードで
    正常に動作するのですがDataGridの場合はイベントハンドラの
    dataGrid1.BindingGroup.BindingExpressionsに<Binding.ValidationRules>
    で指定したものが設定されていない(サイズが0)となり検証が行われません。

    DataGridで一括検証を行いたい場合はどのように指定すれば良いかご存知の
    方が見えましたら教えて下さい。

    以上、宜しくお願い致します。

    2010年11月22日 9:22

回答

  • 不可能ではないでしょうけど、それよりももう一つの要件である名前によるグループにしてしまえば良いんでは?
    • 回答としてマーク taka88 2010年11月24日 10:12
    2010年11月23日 23:48

すべての返信

  • BindingGroup が同一になる要件は、名前による物をのぞけば

    バインディングのソースと、BindingGroup を保持している要素の DataContext が同じオブジェクトであり、BindingGroupName プロパティが設定されていない。

    ということのようなので、コレクション全体が DataContext となる DataGrid と、コレクション内の一要素が DataContext となる CellTemplate 内の要素ではそのままでは BindingGroup は同一にならないのではないでしょうか?

    2010年11月23日 12:00
  • Hongliang様、返信ありがとうございます。

    更新ボタンクリック時にDataGrid内にあるCellTemplateに関連付けられたRequireRuleを

    直接呼び出すといったことは可能でしょうか?

    以上、宜しくお願い致します。

    2010年11月23日 21:51
  • 不可能ではないでしょうけど、それよりももう一つの要件である名前によるグループにしてしまえば良いんでは?
    • 回答としてマーク taka88 2010年11月24日 10:12
    2010年11月23日 23:48
  • Honglingさんのご指摘のように

    DataGrid側のBindingGroupにName属性を指定してDataTemplate側のBindingにはBindingGroupName属性で同じ名前を指定することであっさり解決しました。

    大変助かりました。

     

    2010年11月24日 10:12