2013-10-13 2 views
0

유효성 검사 규칙을 통해 DataGrid 셀에 대한 유효성 검사를 구현하고 있습니다.WPF - MVVM : Datagrid 유효성 검사, 툴팁 오류 메시지가 작동하지 않습니다.

셀 편집에 대한 유효성 검사가 수행되지만 오류 메시지와 함께 툴팁을 표시 할 방법이 없습니다. 셀 값이 범위를 벗어나지 만 오류 메시지 툴팁이 아니라면 오류 아이콘이 표시됩니다.

는 XAML 코드 :

<UserControl.Resources> 
    <local:DatagridViewModel x:Key="ViewModel"/> 
    <CollectionViewSource x:Key="cvsEntries" Source="{Binding LineItems, Source={StaticResource ViewModel}}"/> 

    <Style TargetType="{x:Type DataGridRow}"> 
     <Setter Property="ValidationErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Image Source="../Images/error.png" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem}" Margin="0" Width="15" Height="15" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<DataGrid x:Name="lineItemGrid" Grid.ColumnSpan="5" Grid.Row="13" Background="#FFD6E9F5" ItemsSource="{Binding Source={StaticResource cvsEntries}}" AutoGenerateColumns="False" CanUserDeleteRows="False" VerticalContentAlignment="Stretch" Margin="0,4,0,0" SelectionMode="Single" SelectedItem="{Binding SelectedLineItem}"> 
    <DataGrid.Resources> 
     <SolidColorBrush x:Key="DataGridDeployedTextForeground" Color="#FF409540"/> 
     <SolidColorBrush x:Key="DataGridObsoleteTextForeground" Color="#FF934440"/> 
     <SolidColorBrush x:Key="DataGridDraftTextForeground" Color="#FF654093"/> 

    </DataGrid.Resources> 
    <DataGrid.Columns> 

     <DataGridTextColumn Binding="{Binding Product, Mode=OneWay}" Header="Product" IsReadOnly="True"/> 
     <DataGridTextColumn Binding="{Binding State, Mode=OneWay}" Header="State" SortMemberPath="State" IsReadOnly="True"/> 
     <DataGridTextColumn Header="Cust.Opt"> 
      <DataGridTextColumn.Binding> 
       <Binding Path="CustomAttributeValue" UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
          <local:PropertyValidation> 
          <local:PropertyValidation.ValidValue> 
           <local:ValueChecker 
            Minimum="{Binding Path=CustomAttributeMinValue, Source={StaticResource cvsEntries}}" 
            Maximum="{Binding Path=CustomAttributeMaxValue, Source={StaticResource cvsEntries}}"/> 
          </local:PropertyValidation.ValidValue> 
         </local:PropertyValidation>         
        </Binding.ValidationRules> 
       </Binding> 
      </DataGridTextColumn.Binding> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

이 유효성 검사 코드 :

public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
{ 
    var result = new ValidationResult(true, null); 

    var minValue = System.Convert.ToInt32(ValidValue.Minimum); 
    var maxValue = System.Convert.ToInt32(ValidValue.Maximum); 
    var valueToCheck = minValue; 
    Error = "Error!!!"; 

    int.TryParse(value as string, out valueToCheck); 

    CanBeValidated = true; 
    if (minValue == -1 && maxValue == -1 && value == string.Empty) 
    { 
    value = null; 
    CanBeValidated = false; 
    } 

    if (CanBeValidated == true && (valueToCheck < minValue || valueToCheck > maxValue)) 
    { 
    result = new ValidationResult(false, this.Error); 
    } 
    else 
    { 
    result = new ValidationResult(true, "OK"); 
    } 

    return result; 
} 

}

이 첨부 된 속성 :

public class ValueChecker : DependencyObject 
{ 
    public static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(string), typeof(ValueChecker)); 

    public string Minimum 
    { 
     get 
     { 
     return (string)GetValue(MinimumProperty); 
     } 
     set 
     { 
     SetValue(MinimumProperty, value); 
     } 
    } 

    public static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(string), typeof(ValueChecker)); 

    public string Maximum 
    { 
     get 
     { 
     return (string)GetValue(MaximumProperty); 
     } 
     set 
     { 
     SetValue(MaximumProperty, value); 
     } 
    } 

감사합니다 어떤 단서 이 문제에 대한. 검증 중

+1

유효한 결과를 얻으려면 'ValidationResult.ValidResult'를 반환해야합니다. – Ninglin

답변

0

얻기 오류 메시지는 다음과 같습니다

<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="true"> 
     <Setter Property="ToolTip" 
     Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
         Path=(Validation.Errors)[0].ErrorContent}"/> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

그것을 밖으로 시도하고이 일 경우 저희에게 알려주십시오. :)

관련 문제