DataGrid中的验证未显示工具提示

时间:2015-01-15 12:08:48

标签: c# wpf xaml datagrid

在我的xaml中,我试图在数据网格中的工具提示中显示错误。 Texblock的边框为红色,网格行显示为红色“!”要说有一个错误,但没有显示tooptip(在鼠标悬停时)

xaml是

<Window.Resources>
    <!--Error Template to change the default behaviour-->

    <ControlTemplate x:Key="ErrorTemplate">
        <DockPanel LastChildFill="True">
            <Border BorderBrush="Red" BorderThickness="1">
                <AdornedElementPlaceholder />
            </Border>
        </DockPanel>
    </ControlTemplate>
    <!--To display tooltip with the error-->

    <Style TargetType="TextBlock">
        <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>

</Window.Resources>
<DataGrid Name="grid" HorizontalAlignment="Stretch" ItemsSource="{Binding mMngModelList}" Margin="0,0,0,50" VerticalAlignment="Stretch" AutoGenerateColumns="False" CanUserAddRows="False">

        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Name">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Name}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>                
            <DataGridTemplateColumn Header="Type">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Type}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding Type}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Range Left">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding RangeLeft,ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}" Validation.ErrorTemplate="{StaticResource ErrorTemplate}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding RangeLeft, ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}" Validation.ErrorTemplate="{StaticResource ErrorTemplate}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

在Code中,我的类实现了IDataErrorInfo,后面的代码是

public string this[string columnName]
{
    get
    {
        var result = string.Empty;
        switch (columnName)
        {
            case "RangeLeft":
                if (RangeLeft == 0)
                {
                    result = "RangeLeft should be greater than zero";
                }
                break;
        }

        return result;

   }
}

public string Error
{
    get
    {
        StringBuilder error = new StringBuilder();

    // iterate over all of the properties
    // of this object - aggregating any validation errors
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(this);
    foreach (PropertyDescriptor prop in props)
    {
        String propertyError = this[prop.Name];
        if (propertyError != string.Empty)
        {
            error.Append((error.Length != 0 ? ", " : "") + propertyError);
        }
    }

    return error.Length == 0 ? null : error.ToString();
    }
}

还有一种方法,在满足所有验证之前,ObservableCollection不会更新吗?

1 个答案:

答案 0 :(得分:0)

试试这个Style

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