2010-12-18 6 views
1

저는 XamlServices.Transform을 사용하여 개체 모델을 가져 와서 Xaml로 serialize합니다.System.Xaml.XamlXmlWriter가 내 MarkupExtension을 이스케이프하지 못하게하는 방법은 무엇입니까?

WriteValue를 무시하는 XamlXmlWriter에서 상속 한 클래스를 구현했습니다. 나는 사용자 정의 된 MarkupExtension을 렌더링 된 Xaml로 다시 인스턴스화하기 위해 이것을 사용하고있다.

WriteValue의 "value"를 MarkupExtension의 구문으로 바꾸면 XamlXmlWriter가 자동으로 MarkupExtension을 이스케이프 처리합니다.

값을 "{MyExtension}"으로 설정하면 렌더링 된 xaml은 "{} {MyExtension}"처럼 보입니다. - 이스케이프 처리되지 않은 이전 버전을 원합니다.

현재 나는이 ("= \"은 {} {내 Extension ","{내 Extension} ") 작동하지만 꽤하지 않다가 생성 된 것 후 XAML에가.

는 교체가 불쾌한 일을 해요 이이 이스케이프가가는 시점에서 XAML의 쓰기를 차단하고 MarkUpExtension을 탈출? 또는 아마도 MarkUpExtension을 렌더링 할 수있는 더 좋은 방법이하지?

감사를 말할 수있는 방법,

다니엘

답변

0

글쎄, 나는 당신이 TypeConverterAttributeMarkupExtension으로 변환하는 속성 (또는 형식 자체)에 추가합니다.

[TypeConverter(typeof(MyClassToMyExtensionConverter))] 
public sealed class MyClass { } 

public sealed class MyExtension : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider sp) { return new MyClass(); } 
} 

public sealed class MyClassToMyExtensionConverter : TypeConverter 
{ 
    public override bool CanConvertTo(ITypeDescriptorContext ctx, Type t) { return t == typeof(MarkupExtension); } 
    public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo culture, object obj, Type t) { return ConvertToInternal((MyClass) obj); } 
    private MyExtension ConvertToInternal(MyClass value) { return new MyExtension(); } 
} 

은 당신이 찾고있는이 무엇인가, 또는 당신이 XamlXmlWriter 내에서 그것을 할 수 있어야 수행 MyClass가 내 Extension을 사용하여 직렬화해야 그렇다면, (안된, 메모리에서, 아마 오타가) 사용 ?

+0

안녕하세요 Robert 님, 감사합니다. 그것은 내 상황에서 도움이되지 않습니다. XamlxmlWriter 자체에서 필요합니다. 어쨌든 고마워. –

+0

@ Daniel James Bryars - 죄송합니다. 미안해. 돌아 오기까지 너무 오래 걸렸다. 자신 만의 XamlSchemaContext를 구현할 수 있습니까? –

관련 문제