问题描述
|
下面的代码应该显示一个包含三个列表框的堆栈,每个列表框包含所有系统字体的列表。第一个未排序,第二个和第三个按字母顺序排列。但是第三个是空的。调试时,在“ 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();
}
}
}
第三个绑定有什么问题?
解决方法
您需要先初始化ѭ2need,然后再调用
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;
}
, 绑定是在InitializeComponent
期间创建的,而SystemFonts
是null
的创建。设置后,绑定无法知道该属性的值已更改。
您还可以在静态构造函数中设置“ 2”,这可能是更可取的选择,因为它是静态属性。否则,每次MainWindow
的实例都将更改静态属性。
public partial class MainWindow : Window {
public static List<FontFamily> SystemFonts{get; set;}
static MainWindow {
SystemFonts = Fonts.SystemFontFamilies.OrderBy(f => f.ToString()).ToList();
}
...
}