C# 在另一个类中使用我的ViewModel的RelayCommand

C# 在另一个类中使用我的ViewModel的RelayCommand,c#,wpf,C#,Wpf,我目前正在用C#WPF制作一个FileExplorer。我的ViewModel加载侧栏的目录和资源管理器主字段的目录。我试图让它看起来像Windows文件资源管理器。 假设应用程序从C:\users\myname开始。我的应用程序加载此路径中的所有目录,并将其显示为按钮。现在,一旦我点击按钮,我想移动到我正在点击的目录 示例:C:\users\myname->C:\users\myname\desktop 路径链接到按钮并作为命令参数提供,但我无法访问该按钮,因为ItemSource是ViewM

我目前正在用C#WPF制作一个FileExplorer。我的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);
            }
        }

public RelayCommand主目录加载{get;set;}
公共主视图模型()
{
LoadMainDirectory();
MainDirectoryLoad=newrelaycommand(o=>LoadMainDirectory());
}
公共void loadmain目录(字符串路径=@“C:\Users\renes\”)
{
导航路径=路径;
MainDirectory=新列表();
var directories=Directory.GetDirectories(NavigationPath);
foreach(目录中的字符串文件)
{
DirectoryInfo dirInfo=新的DirectoryInfo(文件);
SidebarDirectory=新导航目录(
dirInfo.Name,
dirInfo.CreationTime,
dirInfo.LastWriteTime,
dirInfo.FullName);
MainDirectory.Add(SidebarDirectory);
}
}
要在中使用命令的my.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>

有没有办法在NavigationDirectory类中使用MainViewModel的RelayCommand,或者有没有办法在xaml中传递命令,即使ItemSource不是MainViewModel


如果没有,那么解决这个问题的好方法是什么?在我的NavigationDirectory中创建一个新命令意味着我还必须将NavigationPath之类的参数传递给它。

您可以使用
{RelativeSource}
绑定到可视化祖先的属性:

Command="{Binding DataContext.MainDirectoryLoad, 
    RelativeSource={RelativeSource AncestorType=ListBox}}"

确保属性的名称匹配。在您发布的XAML中,您尝试绑定到一些
MainDirectoryLoading
属性,但代码中的属性似乎被称为
MainDirectoryLoad

哦,是的,我刚才调用的属性是尝试操作后留下的。我会试试你的想法,看看是否有效,谢谢!