使用XamlReader.Load(...)动态加载后绑定UiElement DataContext

时间:2016-02-03 09:15:10

标签: c# wpf binding code-behind

猜猜这到底是多么容易,而且我只是在一个心灵障碍或其他什么东西,但这里有:

这基本上是关于某些运输标签的打印预览。由于目标是能够使用不同的标签设计,我目前正在使用XamlReader.Load()从XAML文件中动态加载预览标签模板(以便可以修改它而无需重新编译程序)。 / p>

public UIElement GetLabelPreviewControl(string path)
{
    FileStream stream = new FileStream(path, FileMode.Open);
    UIElement shippingLabel = (UIElement)XamlReader.Load(stream);
    stream.Close();
    return shippingLabel;
}

加载的元素基本上是画布

<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(因为它也是错误的来源)但是我宁愿在后面的代码中创建一个Binding:

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在父级上发生更改时,会出现问题。然后这个更改没有反映在加载的预览中,但是Context只是保持绑定到旧对象...我的绑定表达式有什么问题或者我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

您不需要绑定,因为默认情况下DataContext是由Property Value Inheritance从父元素继承的。{/ p>

所以只需删除它:

try
{
    PrintPreview.Child = GetLabelPreviewControl(labelPath);
}
catch (Exception ex)
{
    // Handle Exception Stuff here...
}

答案 1 :(得分:0)

很多属性的默认模式是OneWay。您是否曾尝试将其设置为两种方式?

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...
}