下面的代码应该显示三个列表框的堆栈,每个列表框包含所有系统字体的列表。第一个是未排序的,第二个和第三个是按字母顺序排列的。但第三个是空的。调试时,我在VS输出窗口中看不到任何绑定错误消息。
标记是:
<Window x:Class="FontList.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:FontList"
Title="MainWindow" Height="600" Width="400">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ListBox Grid.Row="0" ItemsSource="{Binding Source={x:Static Fonts.SystemFontFamilies}}" />
<ListBox Grid.Row="1" ItemsSource="{Binding Path=SystemFonts}" />
<ListBox Grid.Row="2" ItemsSource="{Binding Source={x:Static local:MainWindow.SystemFonts}}" />
</Grid>
背后的代码是:
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Media;
namespace FontList
{
public partial class MainWindow : Window
{
public static List<FontFamily> SystemFonts { get; set; }
public MainWindow() {
InitializeComponent();
DataContext = this;
SystemFonts = Fonts.SystemFontFamilies.OrderBy(f => f.ToString()).ToList();
}
}
}
第三次绑定有什么问题?
答案 0 :(得分:2)
在致电SystemFonts
之前,您需要初始化InitalizeComponent
。 WPF绑定无法知道属性的值已更改。
public MainWindow() {
SystemFonts = Fonts.SystemFontFamilies.OrderBy(f => f.ToString()).ToList();
InitializeComponent();
DataContext = this;
}
或者更好,使用:
static MainWindow() {
SystemFonts = Fonts.SystemFontFamilies.OrderBy(f => f.ToString()).ToList();
}
public MainWindow() {
InitializeComponent();
DataContext = this;
}
答案 1 :(得分:1)
绑定是在InitializeComponent
期间创建的,而SystemFonts
是null
。设置后,绑定无法知道属性的值已更改。
您还可以在静态构造函数中设置SystemFonts
,这可能更好,因为它是静态属性。否则,MainWindow
的每个实例化都将更改静态属性。
public partial class MainWindow : Window {
public static List<FontFamily> SystemFonts{get; set;}
static MainWindow {
SystemFonts = Fonts.SystemFontFamilies.OrderBy(f => f.ToString()).ToList();
}
...
}