【问题标题】:How to keep bindings when serializing a WPF usercontrol into an XElement将 WPF 用户控件序列化为 XElement 时如何保持绑定
【发布时间】:2012-11-02 16:03:34
【问题描述】:

我正在尝试序列化一个自定义 WPF 用户控件,该控件具有一个带有文本块的网格,该文本块绑定到名为“频率”的依赖项属性。定义textblock的sn-p如下(用户控件的定义比较长,贴在这里!):

<TextBlock x:Name="FrequencyText" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"
                               FontFamily="Arial Rounded MT"
                               Foreground="White" FontSize="10" FontWeight="DemiBold" Margin="3"
                               TextBlock.Text="{Binding Frequency, ElementName=FrequencyButtonControlA, Path=Frequency}"
                               TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Left" />

我正在开发一个编辑器工具,它使用户能够将一些自定义控件排列到画布中并更改它们的属性,我需要为用户提供克隆现有元素的能力。为了做到这一点,我将控件序列化为一个 XElement,然后实例化一个新的。执行序列化的代码如下:

var contentXaml = (commsPanelItem.Content != null) ? XamlWriter.Save(commsPanelItem.Content) : string.Empty;
var serializedItem = new XElement(
"CommsPanelItem",
new XElement("Type", commsPanelItem.GetType().ToString()),
new XElement("Left", Canvas.GetLeft(commsPanelItem.UIElement)),
new XElement("Top", Canvas.GetTop(commsPanelItem.UIElement)),
new XElement("Width", commsPanelItem.Width),
new XElement("Height", commsPanelItem.Height),
new XElement("zIndex", Panel.GetZIndex(commsPanelItem.UIElement)),
new XElement("Content", contentXaml),
commsPanelItem.GetAttributesForSavingPanelInConfigurator() as XElement);
return serializedItem;

我遇到的问题是,在序列化文本块时,“文本”字段不保留与“频率”依赖属性的绑定,它只是使用用户分配的值(“131.5 " 在以下示例中):

TextBlock Text="131.5" FontFamily="Arial Rounded MT" FontWeight="SemiBold" FontSize="10" Foreground="#FFFFFFFF" TextAlignment="Center" Name="FrequencyText" Margin="3,3,3,3" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" Grid.ColumnSpan="2"

我的问题是:有什么方法可以序列化依赖属性的绑定而不是实际值?

提前致谢!

【问题讨论】:

    标签: wpf binding xelement


    【解决方案1】:

    使用在 FrameworkElements 上找到的“GetBinding”方法,而不是提取它的值:

    BindingExpression bindingExpression = myTextBox.GetBindingExpression(TextBox.TextProperty);
    

    那么你大概可以序列化 BindingExpression。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多