2011-03-20 28 views
2

我有一個列表裏面的列表..這個列表的類型是「RequirementsBase」(抽象類)。WPF轉換器 - 返回一個類類型的名稱

當我從父列表框中選擇一個項目時,我想要做的是讓列表中每個項目的Name屬性顯示在列表框中。 (希望這是有道理的)。沒有轉換器,當項目顯示在列表框中時,我會得到類的完整路徑名稱空間。一旦我連接了一個轉換器,它就會顯示列表的名稱,而不是列表中的內容。它也在列表框中顯示該名稱,每個字母在其自己的行上。

這裏是我的XAML掛鉤轉換器:

<ListBox Name="lstRequirements" 
ItemsSource="{Binding ElementName=listTreasureCards, 
       Path=SelectedItem.Requirements, 
       Converter={StaticResource RequirementConverter}}" /> 

這裏是我的轉換代碼:

public object Convert(object value, Type targetType, object parameter, 
         System.Globalization.CultureInfo culture) 
{ 
     return value.GetType().Name; 
} 

public object ConvertBack(object value, Type targetType, object parameter, 
          System.Globalization.CultureInfo culture) 
{ 
    return value.GetType(); 
} 

我是一個小白,所以請說小白。 :)

+0

目前尚不清楚,從你想要什麼的問題顯示。一個例子會有所幫助。 – Jon 2011-03-20 02:51:54

+0

我想顯示列表中類的類型的名稱屬性。 所以,如果我是這樣做: 名單 MYLIST(RequirementsBase是一個抽象類,所以名單實際上已經是慾望的物品,等級等) 如果我沒有MYLIST [0] .GetType()。名字我會得到「性別」。我如何讓它顯示在我的列表框中,而不是它的命名空間 - 這是GameInfo.Requirements.Sex? – Stacey 2011-03-20 03:01:20

回答

4

你的問題是,你把轉換器列表而不是列表元素上。爲了解決這個問題,你必須將內容添加到項目模板(描述每個列表框項目是如何顯示的模板),並把轉換器有:

<ListBox Name="lstRequirements" 
     ItemsSource="{Binding ElementName=listTreasureCards, 
           Path=SelectedItem.Requirements"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ContentControl Content="{Binding Converter={StaticResource 
                 RequirementConverter}}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

謝謝Gabe!這固定:) – Stacey 2011-03-20 03:18:33

0

我相信你說的是你有一個IEnumerable>作爲你的listTreasureCards數據源。這將是RequirementsBase列表的列表。

我相信你想要的是每個對象(IEnumerable)的名稱的平面列表,其中每個元素對應於列表列表的一個元素。

如果是這種情況,你應該嘗試像下面這樣的LINQ表達式。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    var typedList = value as IEnumerable<IEnumerable<RequirementsBase>>; 
    if (null == typedList) return null; 

    return (from list in typedList 
      from elem in list 
      select elem.GetType().Name); 
} 

因爲這是一種全損失算法,所以在實現ConvertBack時沒有什麼意義;只是拋出一個NotImplementedException。另外,就像旁邊一樣,字母出現在不同行上的原因是ItemSource需要IEnumerable。你的convert方法返回一個字符串,它恰好是一個IEnumerable(字符串)。所以,出於這個原因,每封信都以不同的方式結束。

+0

我試圖暗示你的方法,但每次運行它都會返回null。 – Stacey 2011-03-20 03:19:03

+0

我認爲這將工作,如果你刪除額外的'IEnumerable <>'s之一。 – Gabe 2011-03-20 03:21:44

+0

我曾嘗試過,也沒有奏效。儘管如此,我確實得到了它與另一個人的解決方案。 – Stacey 2011-03-20 03:34:10

0

實現目標的最簡單最直接的方式將覆蓋RequirementsBase.ToString

public override string ToString() { 
    return this.GetType().Name; 
} 
相關問題