如何在代码中绑定到DataTemplate?

时间:2018-04-24 00:43:20

标签: c# wpf xaml data-binding datatemplate

我有一个在XAML中定义的数据模板,可以通过调用App.Current.Resources["foo"]来访问。我无法在XAML中的模板上定义数据绑定,因为无法从可视化树(源为DataGridColumn类型对象)访问绑定的源,因此我必须定义绑定代码背后。

如何将绑定附加到DataTemplate,以便在调用.LoadContent( )时,结果将尊重指定的数据绑定?

符合最小,完整和可验证的示例要求:

确保将APP.XAML文件的构建操作设置为PAGE。

的App.xaml:

<Application
    x:Class="MCVE.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MCVE" StartupUri="MainWindow.xaml">
    <Application.Resources>
        <DataTemplate x:Key="Template">
            <TextBlock />
        </DataTemplate>
    </Application.Resources>
</Application>

App.xaml.cs:

using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Markup;
using System.Xml;

namespace MCVE {
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
    public partial class App {
        [STAThread]
        public static int Main( ) {
            App program = new App( );
            program.InitializeComponent( );
            DataTemplate foo = program.Resources["Template"] as DataTemplate;
            DataGridTemplateColumn source = new DataGridTemplateColumn( );
            source.Header = "Foo";
            Binding b = new Binding( ) {
                Path = new PropertyPath(
                    DataGridColumn.HeaderProperty ),
                Source = source
            };

            //How do I set the binding to the TextBlock within
            //the DataTemplate so that the next time the
            //template is loaded, the TextBlock will
            //read "Foo"?

            return program.Run( );
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这就是你需要的!

将您的xaml代码放在Page并构建。

 <DataGrid Name="Users" AutoGenerateColumns="False">


     <DataGrid Name="dgUsers" AutoGenerateColumns="False">
                            <DataGrid.Columns>

                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}" />

                                    <DataGridTemplateColumn Header="Birthday">
                                            <DataGridTemplateColumn.CellTemplate>
                                                    <DataTemplate>
                                                            <DatePicker SelectedDate="{Binding Birthday}" BorderThickness="0" />
                                                    </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                    </DataGridTemplateColumn>

                            </DataGrid.Columns>
                    </DataGrid>

答案 1 :(得分:0)

  

如何将绑定附加到DataTemplate,以便在调用.LoadContent( )时,结果将尊重指定的数据绑定?

您可以在模板中定义绑定。您无法定义具有绑定的模板,然后即时将绑定应用于此模板。必须定义模板&#34;作为一个整体&#34;所以我害怕这种做法不会起作用。

您可以考虑使用DataTemplate方法以编程方式创建具有不同数据绑定的不同模板,而不是在App.xaml中定义XamlReader.Parse,例如:

string fooTemplate = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x = \"http://schemas.microsoft.com/winfx/2006/xaml\"><TextBlock Text=\"{Binding Foo}\"></DataTemplate>";
source.CellTemplate = XamlReader.Parse(fooTemplate) as DataTemplate;