2016-02-03 78 views
0

競猜動態加載後這到底blatently容易,我只是我一記塊或東西上,但這裏有雲:綁定的UIElement的DataContext與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 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只是保持綁定到舊對象......我的綁定表達式有什麼問題,或者我在這裏丟失了什麼?

+1

你不應該需要DataContext的所有結合,作爲DataContext的是默認由[屬性值繼承(HTTPS父元素繼承:// MSDN。 microsoft.com/en-us/library/ms753197(v=vs.100).aspx)。 – Clemens

+0

謝謝......那是錯誤。我不知何故在腦海中想到,我必須在運行時加載'UIElement'後手動綁定'DataContext'。 – Adwaenyth

回答

1

你不需要綁定,因爲DataContext在默認情況下從父元素繼承了Property Value Inheritance

所以只是將其刪除:

try 
{ 
    PrintPreview.Child = GetLabelPreviewControl(labelPath); 
} 
catch (Exception ex) 
{ 
    // Handle Exception Stuff here... 
} 
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... 
} 
+0

如果綁定目標會更改綁定屬性,則只需要雙向綁定即可,這在此處不會發生。 – Clemens