DataGrid行标题模板和行验证问题

时间:2016-08-03 03:52:19

标签: wpf mvvm datagrid

我有一个WPF应用程序,使用MVVM设计模式和Entity Framework。在这个应用程序中,我有一个Datagrid,它有行验证,并且工作得很好。单元格有红色边框,Datagrid行标题有红色!在它里面,正是我想要的。

然后我希望能够双击行标题来执行某些操作,所以我有以下内容将事件绑定到我的ViewModel

for file in *

现在添加它会删除红色!在行标题上指示该行中的错误。

我现在无法弄清楚如何在行验证中同时显示错误以及让我的项目添加交互触发器来绑定命令。

无论我在自定义样式触发器或自定义DataGrid RowValidationErrorTemplates的方式中添加什么,它都被我的RowHeaderTemplate覆盖,我无法弄清楚如何合并这两者。

如何在Datagrid行标题上同时具有错误指示和交互触发?

1 个答案:

答案 0 :(得分: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

<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;
    }

最终结果是整行在整个行级别被标记为无效

我仍然希望能够仅仅影响行标题,所以我仍然会接受答案。