2016-01-27 3 views
0

J'ai vérifié ces réponses, mais aucun n'a eu l'information que je cherche:
How to setup a WPF datatemplate in code for a treeview?
How to set Control Template in code?
Create ControlTemplate programmatically in WPFCréer ControlTemplate dans le code, comment spécifier le convertisseur dans la liaison

Voici l'essentiel de mon code:

DataGridTextColumn col = new DataGridTextColumn(); 
Style styl = null; 
//  Need to add this on a per-column basis 
// <common:RequiredPropertyDisplayBrushConverter x:Key="requiredDisplayBrushConverter" /> 
string xaml = "<ControlTemplate TargetType=\"{x:Type DataGridCell}\"> <TextBox Background=\"{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text, Converter={StaticResource requiredDisplayBrushConverter} > </TextBox> </ControlTemplate>"; 
MemoryStream sr = new MemoryStream(Encoding.ASCII.GetBytes(xaml)); 
ParserContext pc = new ParserContext(); 
pc.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation"); 
pc.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml"); 
ControlTemplate ct = (ControlTemplate)XamlReader.Load(sr, pc); 

styl.Setters.Add(new Setter(TemplateProperty, ct)); 
col.CellStyle = styl; 

Dans ControlTemplate, une liaison fait référence au convertisseur mentionné dans les commentaires. Lorsque le convertisseur est défini dans le xaml comme une ressource pour le DataGrid, j'obtiens une erreur d'exécution: {"Impossible de trouver la ressource 'requiredDisplayBrushConverter'.) Les noms de ressources sont sensibles à la casse."}
Puis-je ajouter ceci comme ressource au colonne? Ou ajoutez-le aux ressources du DataGrid lors de l'exécution?
Ou y a-t-il une autre technique?
Merci -

Répondre

1

Vous pouvez l'ajouter au xaml mais vous devrez le réorganiser. La ressource devra être définie avant de pouvoir l'utiliser. Ce qui signifie que l'arrière-plan devra être défini comme une balise enfant.

Changer votre XAML à ceci:

string xaml = "<ControlTemplate TargetType=\"{x:Type DataGridCell}\"><TextBox><TextBox.Resources><common:RequiredPropertyDisplayBrushConverter x:Key=\"requiredDisplayBrushConverter\" /></TextBox.Resources><TextBox.Background><Binding RelativeSource=\"{RelativeSource TemplatedParent}\" Path=\"Content.Text\" Converter=\"{StaticResource requiredDisplayBrushConverter}\"/></TextBox.Background></TextBox></ControlTemplate>"; 

et vous aurez besoin de définir l'espace de noms commun. Ajouter cette après vos autres espaces de noms (avec l'espace de nom/montage correct, bien sûr):

pc.XmlnsDictionary.Add("common", "clr-namespace:WPFApplication;assembly=WPFApplication"); 

OU, vous pouvez simplement ajouter la ressource à votre App.xaml, si cela est une option.

+0

Merci! J'ai complètement oublié de l'ajouter à app.xaml. J'apprécie l'autre explication aussi. – Number8

+0

De rien. Content d'avoir ajouté cette partie sur app.xaml. Je ne pensais vraiment pas que cela s'appliquait à votre situation. Je déteste demander, mais ... pouvez-vous accepter ma réponse? –