如何动态地将RowValidationErrorTemplate添加到DataGrid?

时间:2017-11-22 09:54:32

标签: c# wpf wpfdatagrid

我想使用C#代码将一个RowValidationErrorTemplate添加到DataGrid(即不在XAML中)。 相应的XAML:

<DataGrid.RowValidationErrorTemplate>
    <ControlTemplate>
        <Grid Margin="0,-2,0,-2" 
              ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent}">
            <Ellipse StrokeThickness="0" Fill="Red" Width="{TemplateBinding FontSize}" 
                     Height="{TemplateBinding FontSize}" />
            <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" 
                       FontWeight="Bold" Foreground="White" HorizontalAlignment="Center" />
        </Grid>
    </ControlTemplate>
</DataGrid.RowValidationErrorTemplate>

如果你想知道背后的原因,这是我的情况:

  1. 我有几个继承自.cs代码的 UserControls
  2. 每个 UserControl 都包含 DataGrid ,其中包含: RowValidationErrorTemplate ,EventHandlers,验证方法,等等。
  3. 我将EventHandlers移动到基类,现在我正在寻找一种方法将我的验证代码的最后一部分移动到基类。

1 个答案:

答案 0 :(得分:1)

您可以使用XamlReader.Parse方法动态创建ControlTemplate

string xaml = "<ControlTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"><Grid Margin=\"0,-2,0,-2\" ToolTip=\"{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent}\"><Ellipse StrokeThickness=\"0\" Fill=\"Red\" Width=\"{TemplateBinding FontSize}\" Height=\"{TemplateBinding FontSize}\" /><TextBlock Text=\"!\" FontSize=\"{TemplateBinding FontSize}\" FontWeight=\"Bold\" Foreground=\"White\" HorizontalAlignment=\"Center\" /></Grid></ControlTemplate>";
dataGrid.RowValidationErrorTemplate = System.Windows.Markup.XamlReader.Parse(xaml) as ControlTemplate;
相关问题