0

为什么这个绑定不起作用?

<Window x:Class="S3PackageInstaller.MainWindow" x:Name="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s3u="clr-namespace:S3PackageInstaller"
    Icon="App.ico" Title="Sims 3 Package Installer" Height="480" Width="740">

    <DockPanel LastChildFill="True">
        <DockPanel DockPanel.Dock="Left" Width="200" VerticalAlignment="Stretch" LastChildFill="True"
            Margin="20,20,0,20">

            <!-- this is the binding that isn't working -->
            <ListView Width="200" ItemsSource="{Binding ElementName=Window1, Path=InstalledPackages}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="Installed Packages" DisplayMemberBinding="{Binding Filename}"></GridViewColumn>
                    </GridView>
                </ListView.View>                
            </ListView>

    <!-- snip -->

</Window>

后面的相关代码:

public partial class MainWindow : Window
{
    public ObservableCollection<object> InstalledPackages { get; private set; }

    public MainWindow()
    {
        InitializeComponent();
        InstalledPackages = new ObservableCollection<object>();
        LoadInstalledPackages();
    }

    private void LoadInstalledPackages()
    {
        var installPath = Settings.Default.TargetDirectory;
        var packages = System.IO.Directory.GetFiles(installPath, "*.package");

        InstalledPackages.Clear();
        foreach (string filename in packages)
            InstalledPackages.Add(new { Filename = filename });
    }

    // snip...
}

当我运行程序时,ListView 是空的。调试时,我已验证该集合包含运行 LoadInstalledPackages 后的项目。

4

1 回答 1

1

我认为问题在于,虽然您的集合属性是ObservableCollection,所以会通知集合更改,但当您首次分配给它时,该属性本身不会引发更改通知。当您按如下方式创建窗口时:

public MainWindow()
{
    InitializeComponent();
    InstalledPackages = new ObservableCollection<object>();
    LoadInstalledPackages();
}

何时InitializeComponent调用您的 UI 并构造绑定。此时InstalledPackages 为空。在下一行中,您将创建您的集合,但由于InstalledPackages不会引发PropertyChanged事件,因此您的绑定不会更新。

在调用之前实现INotifyPropertyChanged或分配 给此属性。ObservableCollectionInitializeComponent

于 2012-07-23T05:42:07.293 回答