将元素后面的代码注入 XAML 数据模板

Posted

技术标签:

【中文标题】将元素后面的代码注入 XAML 数据模板【英文标题】:Inject Code Behind Element Into XAML Data Template 【发布时间】:2016-03-23 17:44:00 【问题描述】:

正如标题所示,我希望将元素背后的代码注入到数据模板中,以便在运行时呈现。

这是我想将元素后面的代码注入的 XAML 代码:

<TabControl x:Name="tcDocuments" DockPanel.Dock="Top">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Binding Name" />
                <Button Content="x" />
            </StackPanel>
        </DataTemplate>
   </TabControl.ItemTemplate>
   <TabControl.ContentTemplate>
       <DataTemplate>
           (INSERT CLASS BELOW'S CONTENT PROPERTY HERE)
       </DataTemplate>
   </TabControl.ContentTemplate>
</TabControl>

这是我将添加到 TabControl 上面的 Items 的类:

public class DocumentTab

    public string File  get; set; 
    public string Name  get; set; 
    public RichTextBox Content  get; set; 

然后每次我将一个新的 DocumentTab 对象添加到 TabControl 的 Item 列表时,RichTextBox 属性“Content”就会插入到 DataTemplate 标记中。

我想这里真正的问题是这可能吗?

干杯。

【问题讨论】:

会一直是 DocumentTab 吗?您能否将 TabControl 的 ItemsSource 绑定到 ObservableCollection,并让 DataTemplate 成为 RichTextBox?您需要更改 Content 的数据类型。 您可以在 DataTemplate 中放置一个 ContentControl 并将其 Content 属性设置为与 DocumentTab 的 Content 属性的绑定,或者任何具有 Content 属性的模型。这允许您使用任何具有 Content 属性的类 您通常不应在模型中引用 UI 元素 (RichTextBox)。 【参考方案1】:

您可以像这样在 DataTemplate 中放置一个 ContentControl:

<DataTemplate>
    <ContentControl Content="Binding Content"/>
</DataTemplate>

您只需要确保该模板所在的任何内容都具有正确的 DataContext,否则绑定可能会更改。

这样做的好处是它不是特定于 DocumentTab,您可以拥有任何具有 Content 属性的类,即您的 UIElement。

MSDN Documentation on ContentControl.Content 为您提供了更多信息,并展示了一些将内容设置为 UIElements 的示例(尽管仅在代码隐藏中显示)

【讨论】:

以上是关于将元素后面的代码注入 XAML 数据模板的主要内容,如果未能解决你的问题,请参考以下文章

JAVA SQL注入测试

如何在C#后面的代码中动态创建数据模板并绑定树视图层次结构数据

sql注入详解

sql注入详解

从文件后面的 asp.net 代码中注入 Javascript

通告更新Apache Solr模板注入远程代码执行漏洞安全风险通告