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 に答える