0

ListBox次のチュートリアルにデータをバインドしました(少なくとも私は行ったと思います) 。バインドしたいクラス要素にはデータが含まれていますが、ListBoxいくつかのイベントの後に何も表示されません。次の部分的な XAML があります。

 <ListBox x:Name="jukeBoxListBox" Height="227" VerticalAlignment="Top" ItemsSource="{Binding FilePathList}"/>

私が持っているWPFフォームcsファイルで。FolderItemsクラスまたはその属性に設定する必要がありfilePathListますか? また、ObservableCollection代わりに使用する必要がありlistますか?

InitializeComponent();    
FolderItems folderItems = new FolderItems();
this.DataContext = folderItems.FilePathList;

私のデータクラス:

class FolderItems : INotifyPropertyChanged
{
    #region INotifyPropertyChanged implementation

    public event PropertyChangedEventHandler PropertyChanged;

    protected void Notify(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion INotifyPropertyChanged implementation

    private ObservableCollection<String> _pathList = new ObservableCollection<string>();

    public ObservableCollection<String> FilePathList
    {
        get { return _pathList; }
        set
        {
            if (value != _pathList)
            {
                _pathList = value;
                Notify("FilePathList");
            }
        }
    }
}

クリックイベントのList要素を変更することに言及する必要があると思います。Buttonたぶん、以下は問題の一部です。

//in the event fItems is an instance of FolderItems   
var files = new ObservableCollection<string>();
ProcessFiles(of.SelectedPath, files);
fItems.FilePathList = files;
//...

    private void ProcessFiles(string path, ICollection<string> files)
    {
        foreach (var file in Directory.GetFiles(path).Where(name => name.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)))
            files.Add(file);    

        foreach (var directory in Directory.GetDirectories(path))
            ProcessFiles(directory, files);

    }

私は Javaland 出身で、C# は初めてです。私の言葉を許してください。

4

2 に答える 2

2

(ここを参照) に変更List<string>すると、アイテムを追加したときなど、リストの変更がバインディングに通知されます。ObservableCollection<string>

また、Notify 呼び出しのプロパティ名を に変更する必要がありますfilePathList

また、.Net のプロパティのコーディング規則に従う必要があります。通常、プロパティは先頭に大文字を付けて記述されます。したがって、あなたの財産はFilePathList.

private ObservableCollection<String> pathList = new ObservableCollection<string>();

public ObservableCollection<String> FilePathList
{
    get { return pathList; }
    set
    {
        if (value != pathList)
        {
            pathList = value;
            Notify("FilePathList"); // changed here
        }
    }
}

名前を変更したプロパティへのバインディングを変更します。

<ListBox ... ItemsSource="{Binding FilePathList}"/>

コレクションへのバインディングおよびコレクション オブジェクトをバインディング ソースとして使用するも参照してください。


アップデート

再帰ProcessFilesを有効にするには、以下に示すようにメソッドを記述する必要があります。

private void ProcessFiles(string path, ICollection<string> files)
{
    foreach (var file in Directory.GetFiles(path).Where(name => name.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)))
    {
        files.Add(file);
    }

    foreach (var directory in Directory.GetDirectories(path))
    {
        ProcessFiles(directory, files);
    }
}

そして、次のように呼び出されます。

var files = new ObservableCollection<string>();
ProcessFiles(of.SelectedPath, files);

var folderItems = new FolderItems();
folderItems.FilePathList = files;
DataContext = folderItems;

または、後でオブジェクトにアクセスする必要がある場合FolderItems(おそらく何らかのイベント ハンドラーで)、 から取得することができますDataContext

DataContext = new FolderItems();

...

var folderItems = DataContext as FolderItems;
ProcessFiles(of.SelectedPath, folderItems.FilePathList);
于 2013-01-10T09:54:51.483 に答える
0

これを試して。mp3 ではなく dll ファイルを検索します。必要に応じてパターンを変更できます。

     public class FolderItems : INotifyPropertyChanged
        {

            public event PropertyChangedEventHandler PropertyChanged;



            //Temp Data
            public FolderItems()
            {


  //Add System.windows.Form assampbly. 
            var dialog = new System.Windows.Forms.FolderBrowserDialog();
            System.Windows.Forms.DialogResult result = dialog.ShowDialog();

            if (result == System.Windows.Forms.DialogResult.OK)
            {
                FilePathList = ProcessFiles(dialog.SelectedPath);


                ////var directories = new System.IO.DirectoryInfo("C:\\Windows\\").GetFiles().Select(x => x.Name);

                //foreach (var file in directories)
                //{
                //    FilePathList.Add(file);
                //}
    }
            }

            private ObservableCollection<String> ProcessFiles(string path)
            {
                string[] directories;
                ObservableCollection<String> fileList = new ObservableCollection<string>();
                var files = new System.IO.DirectoryInfo(path).GetFiles("*.dll").Select(x => x.Name); //Directory.GetFiles(path).Where(name => name.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase));
                fileList = new ObservableCollection<String>(files.ToList<String>());


                //your processing further
                //directories = Directory.GetDirectories(path);
                //foreach (string directory in directories)
                //{
                //    // Process each directory recursively
                //    ProcessFiles(directory);
                //}

                return fileList;
            }

            protected void Notify(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }

            private ObservableCollection<String> _pathList = new ObservableCollection<string>();

            public ObservableCollection<String> FilePathList
            {
                get { return _pathList; }
                set
                {
                    if (value != _pathList)
                    {
                        _pathList = value;
                        Notify("FilePathList");
                    }
                }
            }

        }
于 2013-01-10T12:12:38.900 に答える