嵌套的xaml元素 - 在代码中重写它

时间:2011-03-09 19:56:35

标签: c# wpf xaml

我需要从代码创建一个DataGridColumn。 XAML等价物将是:

    <data:DataGridTemplateColumn Header="Name" Width="100">
        <data:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" TextTrimming="WordEllipsis"></TextBlock>
            </DataTemplate>
        </data:DataGridTemplateColumn.CellTemplate>
    </data:DataGridTemplateColumn>

我是这样开始的:

 DataGridTemplateColumn column = new DataGridTemplateColumn
   {
      Header = "Name",
      Width = 100,
   };

TextBlock inside =  new TextBlock {TextTrimming = TextTrimming.CharacterEllipsis};

但我不知道如何'合并'这样的谜题。 XAML中有嵌套元素,如何从代码中实现这一点?

2 个答案:

答案 0 :(得分:3)

执行此操作的一种好方法是将整个XAML片段打包到一个字符串中,并在其上调用XamlReader.Load()或XamlReader.Parse()。这种方法的一个好处就是它也可以在Silverlight中工作(有一些小问题),你无法在代码中构建DataTemplate

答案 1 :(得分:2)

几乎在那里,将代码更改为此代码并且应该可以正常工作:

DataGridTemplateColumn column = new DataGridTemplateColumn
   {
      Header = "Name",
      Width = 100,
   };
FrameworkElementFactory ftb = new FrameworkElementFactory(typeof(TextBlock));
Binding b = new Binding("Name");
ftb.SetValue(TextBlock.Text, b);
ftb.SetValue(TextBlock.TextTrimming, TextTrimming.CharacterEllipsis);    
DataTemplate ct = new DataTemplate();
ct.VisualTree = ftb;
column.CellTemplate = ct;

除了上述方法之外,另一种方法是在资源中的XAML中定义datatemplate,然后在代码中动态加载它:

<强> XAML:

<Window.Resources>
    <DataTemplate x:Key="myCellTemplate">
        <TextBlock Text="{Binding Name}" TextTrimming="WordEllipsis" />
    </DataTemplate>
</Window.Resources>

<强>代码:

DataGridTemplateColumn column = new DataGridTemplateColumn
   {
      Header = "Name",
      Width = 100,
   };
column.CellTemplate = this.FindResource("myCellTemplate") as DataTemplate;