使用 XamlReader.Load(...) 动态加载后绑定 UiElement DataContext
Bind UiElement DataContext after loading dynamically with XamlReader.Load(...)
我想这最终很容易,我只是在思考障碍或其他问题,但这里是:
这基本上是关于一些运输标签的打印预览。由于目标是能够使用不同的标签设计,我目前正在使用 XamlReader.Load()
从 XAML 文件中动态加载预览标签模板(这样就可以在不重新编译程序的情况下对其进行修改显然)。
public UIElement GetLabelPreviewControl(string path)
{
FileStream stream = new FileStream(path, FileMode.Open);
UIElement shippingLabel = (UIElement)XamlReader.Load(stream);
stream.Close();
return shippingLabel;
}
加载的元素基本上是一个canvas
<Canvas Width="576" Height="384" Background="White"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas.Resources>
<!-- Formatting Stuff -->
</Canvas.Resources>
<!-- Layout template -->
<TextBlock Margin="30 222 0 0" Text="{Binding Path=Name1}" />
<!-- More bound elements -->
</Canvas>
插入边框控件:
<Border Grid.Column="1" Name="PrintPreview" Width="596" Height="404" Background="LightGray">
</Border>
显然我很懒惰,不想每次父级上的 DataContext 更改时都在预览中手动更新 DataContext(因为它也是错误的来源),但我宁愿创建一个绑定后面的代码:
try
{
this.PrintPreview.Child = GetLabelPreviewControl(labelPath);
Binding previewBinding = new Binding();
previewBinding.Source = this.PrintPreview.DataContext;
(this.PrintPreview.Child as FrameworkElement).SetBinding(FrameworkElement.DataContextProperty, previewBinding);
}
catch (Exception ex)
{
// Handle Exception Stuff here...
}
加载模板时效果很好。绑定更新所有预览的数据字段。
当 DataContext 在父级上更改时,就会出现问题。然后这个更改不会反映在加载的预览中,但上下文只是保持绑定到旧对象...我的绑定表达式有问题还是我在这里还缺少什么?
很多属性的默认模式是单向模式。你试过这样设置成两种方式吗?
try
{
this.PrintPreview.Child = GetLabelPreviewControl(labelPath);
Binding previewBinding = new Binding();
previewBinding.Source = this.PrintPreview.DataContext;
previewBinding.Mode = BindingMode.TwoWay; //Set the binding to Two-Way mode
(this.PrintPreview.Child as FrameworkElement).SetBinding(FrameworkElement.DataContextProperty, previewBinding);
}
catch (Exception ex)
{
// Handle Exception Stuff here...
}
您不需要 Binding,因为 DataContext
默认情况下由 Property Value Inheritance 从父元素继承。
所以只需删除它:
try
{
PrintPreview.Child = GetLabelPreviewControl(labelPath);
}
catch (Exception ex)
{
// Handle Exception Stuff here...
}
我想这最终很容易,我只是在思考障碍或其他问题,但这里是:
这基本上是关于一些运输标签的打印预览。由于目标是能够使用不同的标签设计,我目前正在使用 XamlReader.Load()
从 XAML 文件中动态加载预览标签模板(这样就可以在不重新编译程序的情况下对其进行修改显然)。
public UIElement GetLabelPreviewControl(string path)
{
FileStream stream = new FileStream(path, FileMode.Open);
UIElement shippingLabel = (UIElement)XamlReader.Load(stream);
stream.Close();
return shippingLabel;
}
加载的元素基本上是一个canvas
<Canvas Width="576" Height="384" Background="White"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas.Resources>
<!-- Formatting Stuff -->
</Canvas.Resources>
<!-- Layout template -->
<TextBlock Margin="30 222 0 0" Text="{Binding Path=Name1}" />
<!-- More bound elements -->
</Canvas>
插入边框控件:
<Border Grid.Column="1" Name="PrintPreview" Width="596" Height="404" Background="LightGray">
</Border>
显然我很懒惰,不想每次父级上的 DataContext 更改时都在预览中手动更新 DataContext(因为它也是错误的来源),但我宁愿创建一个绑定后面的代码:
try
{
this.PrintPreview.Child = GetLabelPreviewControl(labelPath);
Binding previewBinding = new Binding();
previewBinding.Source = this.PrintPreview.DataContext;
(this.PrintPreview.Child as FrameworkElement).SetBinding(FrameworkElement.DataContextProperty, previewBinding);
}
catch (Exception ex)
{
// Handle Exception Stuff here...
}
加载模板时效果很好。绑定更新所有预览的数据字段。
当 DataContext 在父级上更改时,就会出现问题。然后这个更改不会反映在加载的预览中,但上下文只是保持绑定到旧对象...我的绑定表达式有问题还是我在这里还缺少什么?
很多属性的默认模式是单向模式。你试过这样设置成两种方式吗?
try
{
this.PrintPreview.Child = GetLabelPreviewControl(labelPath);
Binding previewBinding = new Binding();
previewBinding.Source = this.PrintPreview.DataContext;
previewBinding.Mode = BindingMode.TwoWay; //Set the binding to Two-Way mode
(this.PrintPreview.Child as FrameworkElement).SetBinding(FrameworkElement.DataContextProperty, previewBinding);
}
catch (Exception ex)
{
// Handle Exception Stuff here...
}
您不需要 Binding,因为 DataContext
默认情况下由 Property Value Inheritance 从父元素继承。
所以只需删除它:
try
{
PrintPreview.Child = GetLabelPreviewControl(labelPath);
}
catch (Exception ex)
{
// Handle Exception Stuff here...
}