0

コードで ResourceDictionary から DatatTemplate を取得しようとしています。問題は、文字列に保存しようとすると、すべてのバインディングの場所が空または null になることです。

ここに私のコードがあります

    ResourceDictionary dictionary = new ResourceDictionary();
        dictionary.Source = new Uri("WpfApplication1;component/Dict.xaml", UriKind.RelativeOrAbsolute);
        DataTemplate template = (DataTemplate) dictionary["helloTextBox"];
        string save = XamlWriter.Save(template.LoadContent());

洞察をいただければ幸いです。

ありがとう

4

1 に答える 1

0

デフォルトではシリアライズされていないため、シリアライズがバインディングで機能するためには、TypeConverter で BindingExpression のバインディング コンバーターを登録する必要があることがわかりました。

このクラスを ExpressionConverter として追加する必要があります

public class BindingConverter : ExpressionConverter
{
    public override bool CanConvertTo(System.ComponentModel.ITypeDescriptorContext context, Type destinationType)
    {
        return true;
    }

    public override object ConvertTo(System.ComponentModel.ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
    if (destinationType == typeof(MarkupExtension))
    {
        BindingExpression bindingExpression = value as BindingExpression;
        if (bindingExpression == null)
        {
            throw new FormatException("Expected binding, but didn't get one");
        }
        return bindingExpression.ParentBinding;
    }
    return base.ConvertTo(context, culture, value, destinationType);
}

}

次に、このメソッドを使用して、XamlWriter.Save パーツを実行する場所を登録します。

private void Register()
{
    Attribute[] attr = new Attribute[1];
    TypeConverterAttribute vConv = new TypeConverterAttribute(typeof(BindingConverter));
    attr[0] = vConv;
    TypeDescriptor.AddAttributes(typeof(BindingExpression), attr);
}

ここから取得: コード ビハインドでのテンプレート バインディングの設定

于 2013-09-12T12:47:33.897 に答える