在代码中创建controltemplate,如何在binding中指定converter
Create controltemplate in code, how to specify the converter in the binding
我检查了这些答案,但 none 有我要查找的信息:
How to setup a WPF datatemplate in code for a treeview?
How to set Control Template in code?
Create ControlTemplate programmatically in WPF
这是我的代码的要点:
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;
在ControlTemplate中,绑定是指注释中提到的转换器。当转换器在 xaml 中定义为 DataGrid 的资源时,出现运行时错误:{"Cannot find resource named 'requiredDisplayBrushConverter'. Resource names are case sensitive."}
我可以将其作为资源添加到该列吗?或者在运行时将其添加到 DataGrid 的资源中?
还是有其他技巧?
谢谢--
您可以将其添加到 xaml,但您需要重新排列它。需要先定义资源,然后才能使用它。这意味着需要将背景定义为子标签。
将您的 xaml 更改为:
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>";
并且您需要定义公共命名空间。在你的其他命名空间之后添加这个(当然是正确的 namespace/assembly):
pc.XmlnsDictionary.Add("common", "clr-namespace:WPFApplication;assembly=WPFApplication");
或者,如果可以的话,您可以将资源添加到 App.xaml。
我检查了这些答案,但 none 有我要查找的信息:
How to setup a WPF datatemplate in code for a treeview?
How to set Control Template in code?
Create ControlTemplate programmatically in WPF
这是我的代码的要点:
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;
在ControlTemplate中,绑定是指注释中提到的转换器。当转换器在 xaml 中定义为 DataGrid 的资源时,出现运行时错误:{"Cannot find resource named 'requiredDisplayBrushConverter'. Resource names are case sensitive."}
我可以将其作为资源添加到该列吗?或者在运行时将其添加到 DataGrid 的资源中?
还是有其他技巧?
谢谢--
您可以将其添加到 xaml,但您需要重新排列它。需要先定义资源,然后才能使用它。这意味着需要将背景定义为子标签。
将您的 xaml 更改为:
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>";
并且您需要定义公共命名空间。在你的其他命名空间之后添加这个(当然是正确的 namespace/assembly):
pc.XmlnsDictionary.Add("common", "clr-namespace:WPFApplication;assembly=WPFApplication");
或者,如果可以的话,您可以将资源添加到 App.xaml。