2017-06-20 51 views
1

這是一個奇怪的錯誤。我將枚舉綁定到組合框並顯示d​​escription屬性。我使用的解決方案是WPF Binding a ListBox to an enum, displaying the Description Attribute。所以,我的XAML的相關部分是:通過遠程桌面連接時,帶IValueConverter的NullReferenceException

<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> 

然後我的代碼是:

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(); 
    } 
} 

現在怪異的一部分。我啓動程序並從組合框中選擇一個值(這一步很重要)。所有按預期工作。然後我通過遠程桌面連接到電腦。立即在Convert()函數的第一行得到NullReferenceException。 Type參數是一個字符串,但除此之外沒有太多的信息需要排除故障,並且調用堆棧是空的。

+0

在那裏添加一個調試語句並告訴我們,它是對象還是它的值爲null?然後查看堆棧跟蹤並向後查找,找出原因。什麼是對象類型? –

+0

@JohnPeters'Convert()'函數的'value'參數爲空,導致異常。 'EnumConverter.Convert()'是堆棧跟蹤中唯一的東西。 –

+0

好的,轉換器在WPF渲染時調用,那麼對象類型是什麼?你可以顯示XAML部分....和綁定集合嗎? –

回答

2

如果我正確理解你的描述,會拋出當你通過RDP連接異常的程序實例是同一個實例您使用直接登錄會話啓動計算機。即您首先在坐在計算機上啓動程序,然後通過RDP接管相同的用戶會話,並與已運行程序的進行交互。

對不起?

如果是這樣,那麼這是一種正常行爲。切換到RDP連接導致WPF程序丟失所有視頻資源,因爲它不再渲染到本地視頻卡,而是渲染到用於RDP的虛擬視頻驅動程序。因此,WPF必須重建UI。在此過程中,您的綁定暫時具有null值。轉換器在此期間被調用,您可以在沒有首先檢查null值的情況下調用ToString(),這會導致NullReferenceException

因爲你不可能可靠地迫使WPF改變其方式RDP會話的情況下,唯一可行的辦法是檢查valuenull值,並做一些合理的在這種情況下(如return Binding.DoNothing;) 。一旦WPF安定下來,它應該回到你有一個實際價值的狀態,你會回到正常狀態。

0

您的靜態資源沒有任何內容。或者找不到。當此視圖出現時,打開輸出窗口以查看綁定錯誤。

Binding Source={StaticResource MyEnumValues}} 

爲什麼?因爲如果你在下面的ToString()上得到空值,那很可能意味着該值本身爲空。

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

'MyEnumValues'在XAML的'ObjectDataProvider'節中定義。爲了澄清,當我運行程序並從組合框中選擇一個項目時,一切正常。只有當我通過遠程桌面進行連接時,此問題纔會出現。 –

+0

然後,它不是程序本身,而是環境..但是,我沒有看到任何僅僅因爲RDP而失敗的原因。 –