C# 绑定不适用于从代码隐藏克隆的UIElement
我有一个UIBlockContainer,可以作为提交工资单的模板。 我为它提供了一个x:Name,以便能够通过代码隐藏访问它,并能够克隆它。我的问题是,即使我提供了UIBlockContainer的DataContext,克隆对象的绑定似乎也不起作用 我尝试过使用相对源绑定并设置ancestortype=UIBlockContainer,但仍然无法工作 仅当我尝试使用以下方法手动设置它们各自的值时,它才起作用:C# 绑定不适用于从代码隐藏克隆的UIElement,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个UIBlockContainer,可以作为提交工资单的模板。 我为它提供了一个x:Name,以便能够通过代码隐藏访问它,并能够克隆它。我的问题是,即使我提供了UIBlockContainer的DataContext,克隆对象的绑定似乎也不起作用 我尝试过使用相对源绑定并设置ancestortype=UIBlockContainer,但仍然无法工作 仅当我尝试使用以下方法手动设置它们各自的值时,它才起作用: private void AssignPayslipValues(BlockUIC
private void AssignPayslipValues(BlockUIContainer payslipContainer, View_Models.PayslipViewModel.Payslip payslip)
{
((Run)payslipContainer.FindName("FullName")).Text = payslip.PayrollDetail.Employee.FullName;
((Run)payslipContainer.FindName("StartDate")).Text = payslip.PayrollDetail.Payroll.StartDate.ToString("MM/dd/yyyy");
((Run)payslipContainer.FindName("EndDate")).Text = payslip.PayrollDetail.Payroll.EndDate.ToString("MM/dd/yyyy");
}
下面是BlockUIContainer的一个示例部分,它使用绑定FullName、StartDate和EndDate为空:
<BlockUIContainer x:Name="blockUI_playslip" Margin="0,10,0,0">
<Grid>
<StackPanel Margin="0,0,0,10">
<Label HorizontalAlignment="Center" FontSize="30">PAYSLIP</Label>
<Grid>
<TextBlock>
<Run>NAME:</Run>
<Run Name="FullName" Text="{Binding PayrollDetail.Employee.FullName}" />
</TextBlock>
<TextBlock HorizontalAlignment="Center">
<Run>Payroll Period:</Run>
<Run Name="StartDate" Text="{Binding PayrollDetail.Payroll.StartDate}" />
<Run>-</Run>
<Run Name="EndDate" Text="{Binding PayrollDetail.Payroll.EndDate}" />
</TextBlock>
</Grid>
...
</BlockUIContainer>
如果您希望有人为您调试代码,那么您应该包含一个可靠地再现问题的好代码。也就是说,WPF中的“克隆”毫无意义。每当您有“克隆”UI对象的冲动时,这肯定意味着您应该做的是声明一个适用于特定视图模型类型的数据模板,然后在您希望显示该模板的任何内容控件中使用该视图模型类型。我希望能够使用项目集合填充流文档,每个项目都由BlockUIContainer表示,这样分页将正常工作,但是我无法放置Itemscontrol元素,这就是我在代码隐藏中执行此操作的原因而是能够复制BlockUIContainer的模板,然后将其放入流文档中。
private void populateFlowDocuments()
{
foreach (var payslip in VM.Payslips)
{
var clonedPayslipUI = ClonePayslip(blockUI_playslip);
clonedPayslipUI.DataContext = payslip;
fd_Payslip.Blocks.Add(clonedPayslipUI);
}
}
private BlockUIContainer ClonePayslip(BlockUIContainer block)
{
var sb = new StringBuilder();
var writer = XmlWriter.Create(sb, new XmlWriterSettings
{
Indent = true,
ConformanceLevel = ConformanceLevel.Fragment,
OmitXmlDeclaration = true,
NamespaceHandling = NamespaceHandling.OmitDuplicates,
});
var mgr = new XamlDesignerSerializationManager(writer);
// HERE BE MAGIC!!!
mgr.XamlWriterMode = XamlWriterMode.Expression;
// THERE WERE MAGIC!!!
XamlWriter.Save(block, mgr);
StringReader stringReader = new StringReader(sb.ToString());
XmlReader xmlReader = XmlReader.Create(stringReader);
BlockUIContainer newBlock = (BlockUIContainer)XamlReader.Load(xmlReader);
return newBlock;
}