C# 在另一个类中使用我的ViewModel的RelayCommand
我目前正在用C#WPF制作一个FileExplorer。我的ViewModel加载侧栏的目录和资源管理器主字段的目录。我试图让它看起来像Windows文件资源管理器。 假设应用程序从C:\users\myname开始。我的应用程序加载此路径中的所有目录,并将其显示为按钮。现在,一旦我点击按钮,我想移动到我正在点击的目录 示例:C:\users\myname->C:\users\myname\desktop 路径链接到按钮并作为命令参数提供,但我无法访问该按钮,因为ItemSource是ViewModel中的列表,而不是ViewModel本身。 因此编译器告诉我它找不到RelayCommand,因为它不是NavigationDirectory.cs的一部分 NavigationDirectory.cs:C# 在另一个类中使用我的ViewModel的RelayCommand,c#,wpf,C#,Wpf,我目前正在用C#WPF制作一个FileExplorer。我的ViewModel加载侧栏的目录和资源管理器主字段的目录。我试图让它看起来像Windows文件资源管理器。 假设应用程序从C:\users\myname开始。我的应用程序加载此路径中的所有目录,并将其显示为按钮。现在,一旦我点击按钮,我想移动到我正在点击的目录 示例:C:\users\myname->C:\users\myname\desktop 路径链接到按钮并作为命令参数提供,但我无法访问该按钮,因为ItemSource是ViewM
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
哦,是的,我刚才调用的属性是尝试操作后留下的。我会试试你的想法,看看是否有效,谢谢!