2016-06-05 4 views
0

J'ai un problème où mon MarkupExtension se comporte différemment au moment du design, ou plutôt l'analyseur xaml fournit des valeurs différentes.L'analyse de WPF au moment du design est différente

ma classe:

class FormattableConverter : MarkupExtension, IValueConverter 
{ 
    public FormattableConverter(string format) 
    { 
     Format = format; 
    } 

    public string Format { get; set; } 

    public override void ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var formattable = value as IFormattable; 
     return formattable?.ToString(Format, culture); 
    } 

    /* ConvertBack returns NotImplementedException */ 
} 

Je l'utilise pour montrer une valeur DateTime .:

<HeaderedContentControl Content="{Binding DateTimeValue, Converter={c:FormattableConverter 'hh\\:mm\\:ss'}}" 
         /* Other parameters */ /> 

Lorsque la rupture lors de l'exécution, IntelliSense montre le format est hh: mm \\ \ \: ss, et la mise en forme fonctionne.

Mais dans le concepteur d'un FormatException est jeté: Input string was not in a correct format.

Si je déboguer le concepteur (Fixation à XDesProc.exe) IntelliSence me montrer que le format est hh: mm: ss; Les antislashs sont partis.

J'ai essayé:

  • 'hh\\:mm\\:ss'
  • 'hh&#92;&#92;:mm&#92;&#92;:ss'
  • {}hh\\:mm\\:ss
  • Format='hh\\\\:mm\\\\:ss' (cela fonctionne dans le concepteur, mais pas pendant la durée)
  • Format=hh\\\\:mm\\\\:ss (ceci fonctionne dans le concepteur, mais pas exécution)
  • Format=hh\\:mm\\:ss
  • autres combinaisons ci-dessus

Toute idée pourquoi l'analyseur fournit différentes valeurs de chaîne?

Répondre

1

Essayez ceci:

Sur le dessus de votre UserControl/Fenêtre:

<Window.Resources> 
    <c:FormattableConverter x:Key="formattableConverter" /> 
    <sys:String x:Key="myParameter"> hh\\:mm\\:ss </sys:String> 
</Window.Resources> 

puis dans le contrôle:

<HeaderedContentControl Content="{Binding DateTimeVale, 
              Converter={StaticResource formattableConverter} 
              ConverterParameter={StaticResource myParameter}}"> 

</HeaderedContentControl> 

encore si vous avez des problèmes, s'il vous plaît poster un exemple de projet.

+0

J'ai juste essayé de changer mon convertisseur pour utiliser le ConverterParameter au lieu d'une propriété, et de faire ceci: 'ConverterParameter =" hh \: mm \: ss "'. Cela marche! En déplaçant également la chaîne de format vers une ressource fonctionne également. Apparemment, l'analyseur n'aime pas analyser les propriétés personnalisées. – Anders

+0

@Nautious Je suis content que cela a fonctionné. – Vishal