Сейчас я создаю FileExplorer в C# WPF. My ViewModel загружает каталоги боковой панели и каталоги основного поля проводника. Я пытался сделать его похожим на Windows Проводник. Допустим, приложение начинается с C: \ users \ myname. Мое приложение загружает все каталоги по этому пути и отображает их в виде кнопок. Теперь, когда я нажимаю кнопку, я хочу перейти в каталог, который я нажимаю.
Пример: C: \ users \ myname -> C: \ users \ myname \ desktop Путь связан с кнопкой и задан как параметр команды, но я не могу получить доступ к кнопке, поскольку ItemSource - это список внутри моей ViewModel, а не сама ViewModel. Итак, компилятор сообщает мне, что не может найти RelayCommand, потому что он не является частью NavigationDirectory.cs
NavigationDirectory.cs:
public class NavigationDirectory
{
public NavigationDirectory(string directoryName, DateTime creationTime, DateTime changeTime, string path)
{
DirectoryName = directoryName;
CreationTime = creationTime;
ChangeTime = changeTime;
Path = path;
}
public string DirectoryName { get; set; }
public string Path { get; set; }
public DateTime CreationTime { get; set; }
public DateTime ChangeTime { get; set; }
}
Команда в моей ViewModel Я пытаюсь получить доступ :
public RelayCommand MainDirectoryLoad { get; set; }
public MainViewModel()
{
LoadMainDirectory();
MainDirectoryLoad = new RelayCommand(o => LoadMainDirectory());
}
public void LoadMainDirectory(string path = @"C:\Users\renes\")
{
NavigationPath = path;
MainDirectory = new List<NavigationDirectory>();
var directories = Directory.GetDirectories(NavigationPath);
foreach (string file in directories)
{
DirectoryInfo dirInfo = new DirectoryInfo(file);
SidebarDirectory = new NavigationDirectory(
dirInfo.Name,
dirInfo.CreationTime,
dirInfo.LastWriteTime,
dirInfo.FullName);
MainDirectory.Add(SidebarDirectory);
}
}
ListBox в моем .xaml Я хочу использовать команду в:
<ListBox Grid.Row="3" Grid.Column="1" Margin="5" ItemsSource="{Binding MainDirectory}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" IsItemsHost="True"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Button Width="150" Height="50" HorizontalContentAlignment="Left" Style="{StaticResource NavigationButton}"
Command="{Binding MainDirectoryLoading}" CommandParameter="{Binding Path}">
<StackPanel Orientation="Horizontal">
<Image Source="/Images/icons/folder.png" Margin="5"/>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding DirectoryName}" Style="{StaticResource NavigationTextBlock}"/>
<TextBlock Text="{Binding Path}" Style="{StaticResource NavigationTextBlock}" FontSize="10" Foreground="Gray"/>
<TextBlock Text="{Binding ChangeTime}" Style="{StaticResource NavigationTextBlock}" FontSize="8" Foreground="DarkGray"/>
</StackPanel>
</StackPanel>
</Button>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Есть ли способ использовать RelayCommand моей MainViewModel внутри моего класса NavigationDirectory или есть способ передать команду в xaml, даже если ItemSource не является MainViewModel?
Если нет, то какой хороший способ решить эту проблему? Создание нового Команда в моем NavigationDirectory будет означать, что мне также придется передать в нее такие параметры, как NavigationPath.