2009-07-23 65 views
1

使用XAML,我試圖獲得一個列表框來顯示系統字體列表。WPF數據綁定 - 顯示系統字體列表

我不確定在Bindings字符串中輸入什麼內容。

這裏是我的嘗試:

<Window x:Class="ListDataBinding.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:m="clr-namespace:System.Windows.Media;assembly=PresentationCore" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <ListBox ItemsSource="{Binding Source={StaticResource m:Fonts.SystemFontFamilies}}"></ListBox> 

    </Grid> 
</Window> 

我得到一個錯誤:無法找到指定的資源 '{M:Fonts.SystemFontFamilies}'

我不知道我應該打字。我還沒有設法找到一個有用的MSDN頁面 - 如果有人可以指向我的鏈接,我會很感激。

回答

4
<Window x:Class="ListDataBinding.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:m="clr-namespace:System.Windows.Media;assembly=PresentationCore" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <ObjectDataProvider x:Key="fontFamiliesKey" ObjectType="{x:Type m:Fonts}" MethodName="get_SystemFontFamilies"/> 
    </Window.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding Source={StaticResource fontFamiliesKey}}"></ListBox> 

    </Grid> 
</Window> 

試試這個

+0

您是如何知道get_SystemFontFamilies方法的? – Frinavale 2014-08-21 20:48:50

0

的問題是,你的Binding源設置爲{StaticResource的...}。它應該是{x:Static ...}而不是因爲SystemFontFamiliesSystem.Windows.Media.Fonts對象上的一個簡單的舊式靜態CLR屬性,而不是任何類型的資源。事實上,你甚至不需要Binding。這就是你需要:

<ListBox ItemsSource="{x:Static m:Fonts.SystemFontFamilies}" /> 



你真的應該停止閱讀這裏,但是你可以一點sneakier如果你需要最高性能。使用上面的方法 - 您應該使用 - 您正在處理ICollection<FontFamily>WPF,它實際上是一個ReadOnlyCollection<FontFamily>實例。反過來,這是包裝一個簡單的數組FontFamily[]包含你想要的項目。

,因爲額外的包裹層,WPFinternally won't detect填充你的UI控件時,將不得不回落到其較慢的迭代技術的最佳CollectionView。然而,在這種情況下,包裝無意中通過其前史SyncRoot支持公開了原始數組,因此如果您願意,您實際上可以直接通過該屬性訪問FontFamily[]

<ListBox ItemsSource="{Binding Source={x:Static m:Fonts.SystemFontFamilies}, 
           Path=(sc:ICollection.SyncRoot)}" /> 

夫婦有關這方面的事情。請注意,我們回到使用Binding,因爲{x:Static}標記擴展名(StaticExtension)不會遵循超出其一個靜態屬性的屬性路徑。另外請注意這裏需要的ICollection(也就是WPF的皺眉方式)。要支持演員表,您需要將System.Collections名稱空間添加到XAML文件的頂部,如下所示。最後,用這個技巧,你也將失去在Visual Studio XAML設計器中看到字體列表的能力,但在實際運行時,一切正常。

... 
xmlns:sc="clr-namespace:System.Collections;assembly=mscorlib" 
...