2016-08-03 5 views
1

Entity FrameworkでMVVMデザインパターンを使用するWPFアプリケーションがあります。このアプリケーションでは、私はDatagridを持っています。それは行の検証があり、うまく動作します。セルには赤い枠線があり、Datagrid行ヘッダーには赤色の枠線があります。それで、私が欲しいものだけ。DataGrid行ヘッダーテンプレートと行の検証の問題

私はその後、いくつかのアクションを実行するために、行ヘッダーの上にダブルクリックできるようにしたいので、私はこれが今赤を取り除く追加私のViewModel

<DataGrid.RowHeaderTemplate> 
    <DataTemplate> 
     <ContentControl > 
      <Label Content=" "> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="MouseDoubleClick"> 
         <cmd:EventToCommand 
         Command="{Binding Main.SomeCommand, Source={StaticResource Locator}}" 
         CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Label> 
     </ContentControl> 
    </DataTemplate> 
</DataGrid.RowHeaderTemplate> 

にイベントをバインドするために、次のしています!その行のエラーを示す行ヘッダーに挿入します。

行検証でエラーを表示する方法と、アイテムに対話トリガーを追加してコマンドをバインドする方法の両方を実現する方法はありません。

カスタムスタイルトリガまたはカスタムDataGrid RowValidationErrorTemplatesの方法で追加したものは、RowHeaderTemplateによってオーバーライドされています。この2つを組み込む方法を考えることができません。

データグリッドの行ヘッダーにエラー表示と対話トリガーの両方を設定するにはどうすればよいですか?

答えて

0

解決済みです。

としてhttp://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical-Examples#validation

ごと

<Style x:Key="RowStyle" TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="BorderThickness" Value="1"/> 
       <Setter Property="BorderBrush" Value="Red"/> 
       <Setter Property="ToolTip" 
      Value="{Binding RelativeSource={RelativeSource Self}, 
       Path=(Validation.Errors)[0].ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

は、データグリッドに追加するスタイルを作成します

<DataGrid.RowValidationRules> 
    <local:RowDataInfoValidationRule ValidationStep="UpdatedValue" /> 
</DataGrid.RowValidationRules> 

RowStyle="{StaticResource RowStyle}" 

public override ValidationResult Validate(object value, 
        CultureInfo cultureInfo) 
    { 
     BindingGroup group = (BindingGroup)value; 

     StringBuilder error = null; 
     foreach (var item in group.Items) 
     { 
      // aggregate errors 
      IDataErrorInfo info = item as IDataErrorInfo; 
      if (info != null) 
      { 
       if (!string.IsNullOrEmpty(info.Error)) 
       { 
        if (error == null) 
         error = new StringBuilder(); 
        error.Append((error.Length != 0 ? ", " : "") + info.Error); 
       } 
      } 
     } 

     if (error != null) 
      return new ValidationResult(false, error.ToString()); 

     return ValidationResult.ValidResult; 
    } 

最終的な結果は、行全体が

が、私はまだちょうどのみ行ヘッダを達成するのにできるようにしたいと思い、行全体のレベルで無効としてマークされているので、私はまだその答えを受け入れます。