在代码中创建控件模板,如何在绑定中指定转换器
本文关键字:绑定 转换器 代码 创建 控件 | 更新日期: 2023-09-27 18:32:13
我检查了这些答案,但没有一个有我正在寻找的信息:
如何在树视图的代码中设置 WPF 数据模板?
如何在代码中设置控件模板?
在 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;
在控件模板中,绑定是指注释中提到的转换器。 当转换器在 xaml 中定义为 DataGrid 的资源时,我收到运行时错误:{"找不到名为'requiredDisplayBrushConverter'的资源。资源名称区分大小写。
我可以将其作为资源添加到列中吗? 还是在运行时将其添加到 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>";
并且需要定义通用命名空间。在其他命名空间之后添加它(当然,使用正确的命名空间/程序集):
pc.XmlnsDictionary.Add("common", "clr-namespace:WPFApplication;assembly=WPFApplication");
或者,你可以只将资源添加到 App.xaml(如果这是一个选项)。