我有一个在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( );
}
}
}
答案 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;