Использовать RelayCommand моей ViewModel в другом классе - PullRequest
0 голосов
/ 28 мая 2020

Сейчас я создаю 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.

1 Ответ

1 голос
/ 28 мая 2020

Вы можете привязать к свойству визуального предка, используя {RelativeSource}:

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

Убедитесь, что имена свойств совпадают. В опубликованном вами XAML вы пытаетесь выполнить привязку к некоторому свойству MainDirectoryLoading, но свойство в вашем коде, похоже, называется MainDirectoryLoad.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...