2013-07-30 2 views
3

DataGrid/DataGridCells 내에 ValidationErrors가있는 경우 정보를 가져 오는 데 문제가 있습니다.WPF DataGrid Validation.HasError 항상 false (MVVM)

내가 시도하려는 것은 을 통해 버튼을 비활성화하는 것입니다. (CanExecute) basedOn 유효성 검사 오류의 유무. 따라서 DataGrid의 Validation.HasError를 Button의 CommandParameter에 바인딩합니다.

유효성 검사는 뷰 모델IDataErrorInfo 구현하고 잘 작동합니다. 잘못된 값을 포함하는 DataGridCell은 빨간색 테두리와 오류를 설명하는 툴팁을 가져옵니다.

그냥 작동하지 않는 것은 Button의 CommandParameter을 DataGrid의 Validation.HasError에 바인딩하는 것입니다. 이 문제를 디버그하면 Validation.HasError는 항상 false입니다. 왜? 어떻게 해결할 수 있습니까?

나는 여기와 다른 곳에서 발견 한 거의 모든 "해결책"을 시도했다. 지금까지 아무 일도 없었습니다.

내 데이터 그리드 XAML :

<DataGrid x:Uid="DataGrid_1" 
      Name="SomeDataGrid" 
      Grid.Column="0" 
      Grid.Row="1" 
      Grid.RowSpan="2" 
      ItemsSource="{Binding SomeItems}" 
      SelectedItem="{Binding SomeSelectedItem, Mode=TwoWay}" 
      CanUserSortColumns="False" 
      CanUserAddRows="False" 
      CanUserDeleteRows="False" 
      IsReadOnly="False" 
      IsSynchronizedWithCurrentItem="True" 
      IsTabStop="True" 
      IsTextSearchEnabled="True" 
      > 
    <DataGrid.Resources> 
     <SolidColorBrush x:Uid="SolidColorBrush_1" 
         x:Key="{x:Static SystemColors.ControlBrushKey}" 
         Color="{x:Static SystemColors.HighlightColor}" /> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn x:Uid="Comlumn1" 
           x:Name="Comlumn1" 
           Header="SomeHeader" 
           Width="auto"> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate x:Uid="DataTemplate_1"> 
        <ComboBox x:Uid="ComboBox_7" 
           ItemsSource="{Binding DataContext.Attributes,Source={StaticResource ProxyElement}}" 
           SelectedItem="{Binding Attribute, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
           DisplayMemberPath="DESCRIPTION" 
           IsEditable="False" 
           IsTextSearchEnabled="False" 
           Margin="0" 
           Padding="0" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate x:Uid="DataTemplate_2"> 
        <TextBlock x:Uid="TextBlock_15" 
           Text="{Binding Attribute, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
           ToolTip="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTextColumn x:Uid="DataGridTextColumn_2" 
          Header="Value" 
          Width="auto" 
          Binding="{Binding VALUE, ValidatesOnDataErrors=True}"> 
      <DataGridTextColumn.ElementStyle> 
       <Style x:Uid="Style_4" 
         TargetType="{x:Type TextBlock}"> 
        <Setter x:Uid="Setter_4" 
          Property="DataGridCell.ToolTip" 
          Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" /> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
     <DataGridTextColumn x:Uid="DataGridTextColumn_3" 
          Header="Unit" 
          Width="auto" 
          Binding="{Binding UNIT, Mode=OneWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}" 
          IsReadOnly="True" /> 
     <DataGridTextColumn x:Uid="DataGridTextColumn_4" 
          Header="Remark" 
          Width="auto" 
          Binding="{Binding REMARK}" /> 
    </DataGrid.Columns> 
</DataGrid> 

내가 DataGrid에 Validation.Errors에 바인딩하려는 버튼 :

<Button x:Uid="Button_1" 
      Content=" + " 
      Command="{Binding AddItemCommand}" 
      CommandParameter="{Binding (Validation.HasError), ElementName=SomeDataGrid}" /> 
+2

Validation.HasError 아니다 아이가 오류가 있으면 자동으로 true입니다. http://stackoverflow.com/q/127477/620360 – LPL

+0

이 링크에서 모든 솔루션을 사용해 보았습니다. 그들 중 누구도 일하지 않았다! IsValid 메서드의 모든 제공된 구현은 항상 TRUE를 반환합니다. ValidationErrors가 있는지 여부입니다. 또한 모든 DataGridCell에 Validation.GetHasError()를 적용하려고했습니다. 이 메서드는 항상 false를 반환했습니다 ... –

+0

Ok. 어제 뭔가를 놓친 경우를 대비하여 IsValid 구현을 다시 시도했습니다. 나는 그랬다. 데이터 격자가 실제로 표시되기 전에 유효성 검사 오류가 이미 존재하면 잘못된 값을 표시합니다. 방금 모눈의 행이나 셀을 선택한 다음 IsValid 메서드를 다시 실행하면 올바른 값이 표시됩니다. –

답변

7

가 좋아 나는 마지막으로 그것을했다! here의 다음 방법은 참으로 작업을 수행,하지만 내에서 Datagrid를 포함하는 경우에만 후 윈도우가 완전히로드 (예 : 창/UserControl을로드 이벤트 핸들러에.가) : 데이터 그리드에 대한

public bool IsValid(DependencyObject parent) 
{ 
    if (Validation.GetHasError(parent)) 
     return false; 

    // Validate all the bindings on the children 
    for (int i = 0; i != VisualTreeHelper.GetChildrenCount(parent); ++i) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
     if (!IsValid(child)) { return false; } 
    } 

    return true; 
} 
관련 문제