2017-11-22 8 views
0

Ich möchte ein RowValidationErrorTemplate zu einem DataGrid mit C# -Code hinzufügen (d. H. Nicht in XAML). Die entsprechende XAML:Wie fügt man RowValidationErrorTemplate dynamisch zu einem DataGrid hinzu?

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

Wenn Sie den Grund für diese frage mich, hier ist meine Situation:

  1. ich mehrere Usercontrols haben, die von einem CS-Code erben.
  2. Jeder Usercontrol enthält eine Datagrid, die hat: RowValidationErrorTemplate, Eventhandler, Validierungsmethoden, ... etc.

ich die Eventhandler auf die Basisklasse bewegt, jetzt suche ich eine Möglichkeit, den letzten Teil meines Validierungscodes in die Basisklasse zu verschieben.

+0

Warum nicht Ihre eigene Kontrolle zu schaffen, die von Datagrid erbt? – Isma

+0

@Isma, meinst du XAML-Vererbung? Dies ist ein sehr komplexes Thema, das ich zu vermeiden versuche. Deshalb erben meine UserControls von .cs Code. –

Antwort

1

Sie könnten die XamlReader.Parse Methode dynamisch ein ControlTemplate erstellen:

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; 
+0

Vielen Dank. Kann die 'ControlTemplate' nur mit dem XAML-Format bearbeitet werden? Gibt es keine Klassen und Eigenschaften, die dem XAML entsprechen? –

+1

Ja, es gibt die FrameworkElementFactory, aber die Verwendung dieser Methode ist eine veraltete Methode zum programmatischen Erstellen von Vorlagen, wie auf MSDN angegeben: https://msdn.microsoft.com/en-us/library/system.windows.frameworkfactory(v=vs.110)) .aspx – mm8

+0

Danke. Und sie geben an "Die empfohlene Methode zum programmgesteuerten Erstellen einer Vorlage besteht darin, XAML mithilfe der Load-Methode der XamlReader-Klasse aus einer Zeichenfolge oder einem Speicherstream zu laden." –

Verwandte Themen