2017-06-20 3 views
1

Ceci est une erreur étrange. Je lie une énumération à une zone de liste déroulante et affiche l'attribut de description. J'utilise la solution au WPF Binding a ListBox to an enum, displaying the Description Attribute. Ainsi, la partie pertinente de mon XAML est:NullReferenceException avec IValueConverter lors de la connexion via le bureau à distance

<Window.Resources> 
    <local:EnumConverter x:Key="EnumConverter"/> 
    <ObjectDataProvider MethodName="GetValues" 
      ObjectType="{x:Type local:MyEnum}" 
      x:Key="MyEnumValues"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:MyEnum" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 
<ComboBox Name="MyComboBox" ItemsSource="{Binding Source={StaticResource MyEnumValues}}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Converter={StaticResource EnumConverter}}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

Alors mon code est:

public enum MyEnum 
{ 
    [Description("foo")] 
    Foo, 
    [Description("bar")] 
    Bar 
} 

public class EnumConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     FieldInfo field_info = value.GetType().GetField(value.ToString()); 
     object[] attributes = field_info.GetCustomAttributes(false); 
     if (attributes.Length == 0) 
      return value.ToString(); 
     else 
     { 
      DescriptionAttribute attribute = attributes[0] as DescriptionAttribute; 
      return attribute.Description; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Maintenant la partie bizarre. Je démarre le programme et sélectionne une valeur dans la liste déroulante (cette étape est importante). Tout fonctionne comme prévu. Ensuite, je me connecte à l'ordinateur via le bureau à distance. Immédiatement, j'obtiens une exception NullReferenceException sur la première ligne de la fonction Convert(). Le paramètre Type est une chaîne, mais sinon il n'y a pas beaucoup d'informations à résoudre et la pile d'appels est vide.

+0

Ajoutez une déclaration de débogage là et dites-nous, c'est l'objet ou est-ce la valeur qui est nulle? Regardez ensuite la trace de la pile et travaillez en arrière pour découvrir pourquoi. Quel est le type d'objet? –

+0

@JohnPeters L'argument 'value' de la fonction' Convert() 'est null et provoque l'exception. 'EnumConverter.Convert()' est la seule chose dans la trace de la pile. –

+0

Ok, les convertisseurs sont appelés au moment du rendu WPF, alors quel est le type d'objet? Pouvez-vous montrer la partie XAML .... et la collection de liaison? –

Répondre

2

Si je comprends bien votre description correctement, l'instance du programme qui lève l'exception lorsque vous vous connectez via RDP est le même instance que vous avez commencé sur l'ordinateur à l'aide d'une session de connexion directe. C'est à dire. vous démarrez d'abord le programme en étant assis à l'ordinateur, puis vous reprenez la même session utilisateur via RDP et interagissez avec le programme qui exécute déjà le programme.

Correct?

Si c'est le cas, alors ceci est un comportement normal. Si vous passez à la connexion RDP, le programme WPF perd toutes ses ressources vidéo, car il ne restitue plus la carte vidéo locale, mais le pilote vidéo virtualisé utilisé pour RDP. En tant que tel, WPF doit reconstruire l'interface utilisateur. Au cours de ce processus, votre liaison a momentanément une valeur de null. Le convertisseur est appelé pendant ce temps, où vous appelez ToString() sans d'abord vérifier la valeur null, ce qui entraîne le NullReferenceException.

Puisque vous êtes peu susceptible de forcer de manière fiable WPF de changer ses façons dans le cadre d'une session RDP, la seule solution viable est de vérifier value pour une valeur null et à faire dans ce cas, quelque chose de raisonnable (par exemple return Binding.DoNothing;) . Une fois que WPF s'est stabilisé, il devrait revenir dans un état où vous avez de nouveau une valeur réelle et vous reviendrez à l'état normal.

0

Vos ressources statiques n'ont rien dedans. Ou il ne peut pas être trouvé. Ouvrez votre fenêtre de sortie pour voir les erreurs de liaison lorsque cette vue s'affiche.

Binding Source={StaticResource MyEnumValues}} 

Pourquoi? Parce que si vous obtenez null sur ToString() ci-dessous cela signifie très probablement que la valeur elle-même est nulle.

Enum myEnum = (Enum)value; 
    var stringValue = myEnum.ToString(); 
+0

'MyEnumValues' est défini dans la section' ObjectDataProvider' du code XAML. Pour clarifier, tout fonctionne parfaitement bien quand je lance le programme et sélectionne un élément de la combo. Le problème vient dans _lyly_ quand je me connecte ensuite via le bureau à distance. –

+0

Ensuite, ce n'est pas le programme lui-même, mais plutôt l'environnement. Cependant, je ne vois aucune raison pour que cela échoue juste à cause de RDP. –