Я работаю над проектом, который использует Caliburn micro в wpf С#.
Я нахожусь в процессе, когда хочу переписать свой метод ReadMediaFile(), чтобы он отображал все файлы в папке в списке.
Мой метод выглядит так:
private void ReadMediaFile()
{
string result;
_movieviewmodel = new MoviesViewModel();
string[] filePaths = Directory.GetFiles(@"C:/Users/v80770/Desktop/Movies/");
foreach (var file in filePaths)
{
result = Path.GetFileName(file);
_movieviewmodel.MovieName = result;
}
AddItem(_movieviewmodel);
}
Когда я отлаживаю программу, все файлы отображаются в файлах, но только один отображается в моем списке.
AddItem находится в классе под названием TreeViewBase (я думаю, принадлежит caliburn micro) и выглядит следующим образом:
public void AddItem(T item)
{
_dispatcher.SmartInvoke(() => Items.Add(item));
}
У меня есть просмотр файлов фильмов в моем списке, но моя привязка MediaUri в представлении привязана к определенному файлу пути, но я хочу, чтобы он менялся в зависимости от того, что я выбираю
Я попытался отредактировать привязку к этому:
string test = _movieviewmodel.MovieName;
MediaUri = new Uri(test);
Но получить только исключение «System.UriFormatException: «Недопустимый URI: не удалось определить формат URI».»
Новый код Ури:
_movieviewmodel.MovieFilePath = @"C:/Users/v80770/Desktop/Movies/";
string test = _movieviewmodel.MovieFilePath;
MediaUri = new Uri(test + _movieviewmodel.MovieName);
Но он всегда показывает один и тот же фильм, и мой _movieviewmodel.MovieName не меняет имя в зависимости от того, какой фильм я выбираю, это всегда один и тот же фильм.
Предполагая, что вы хотите иметь один экземпляр MoviesViewModel для каждого файла, вам нужно переместить movieviewmodel = new MoviesViewModel(); и AddItem(_movieviewmodel); внутри цикла foreach.
Спасибо, теперь это решилось. Но мой Uri сейчас не работает, см. вопрос редактирования.
Вы пытаетесь создать Uri только из имени файла, а не из полного пути. Добавьте другое свойство, например. MovieFilePath в свой класс MoviesViewModel и используйте его для Uri.





Создание объекта элемента MoviesViewModel и AddItem(_movieviewmodel); должно быть внутри foreach, иначе будет добавлен только последний элемент:
foreach (var file in filePaths)
{
var movieviewmodel = new MoviesViewModel();
movieviewmodel.MovieName = Path.GetFileName(file);
AddItem(movieviewmodel);
}
или
foreach (var file in filePaths)
{
AddItem(new MoviesViewModel
{
MovieName = Path.GetFileName(file)
});
}
Поместите вызов
AddItemвнутриforeach