WPF绑定语法问题

时间:2011-06-13 23:39:11

标签: wpf binding

下面的代码应该显示三个列表框的堆栈,每个列表框包含所有系统字体的列表。第一个是未排序的,第二个和第三个是按字母顺序排列的。但第三个是空的。调试时,我在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();
        }
    }
}

第三次绑定有什么问题?

2 个答案:

答案 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期间创建的,而SystemFontsnull。设置后,绑定无法知道属性的值已更改。

您还可以在静态构造函数中设置SystemFonts,这可能更好,因为它是静态属性。否则,MainWindow的每个实例化都将更改静态属性。

public partial class MainWindow : Window {
    public static List<FontFamily> SystemFonts{get; set;}

    static MainWindow {
       SystemFonts = Fonts.SystemFontFamilies.OrderBy(f => f.ToString()).ToList();
    }

    ...
}