Jak wiązać polecenie do elementu treeview . Mam MainWindowViewmodel z treeviewcommand i próbowałem dodać przycisk wokół elementu, ale polecenie nie zostanie wywołane. Czy jest jakiś inny sposób, aby połączyć polecenie i przejść, który element został kliknięty?

<TreeView x:Name="MainTreeView" HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" ItemsSource="{Binding Departments}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Positions}" DataType="{x:Type VM:Department}">
                <Button Command="{Binding TreeViewCommand}" CommandParameter="{Binding DepartmentName}" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
                    <Label Content="{Binding DepartmentName}"/>
                </Button>
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Employees}" DataType="{x:Type VM:Position}">
                        <Button BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
                        <Label Content="{Binding PositionName}"/>
                        </Button>
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate DataType="{x:Type VM:Employee}">
                                <Button BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
                                <Label Content="{Binding EmployeeName}"/>
                                </Button>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

Mój mainwindowviewmode jest

public class MainWindowViewModel : ViewModelBase
{

    private List<Department> departments;
    public MyICommand<string> TreeViewCommand { get; private set; }

    public MainWindowViewModel()
    {
        TreeViewCommand = new MyICommand<string>(myTreeViewCommand);
        Departments = new List<Department>()
        {
            new Department("DotNet"),
            new Department("PHP")
        };
    }

    public List<Department> Departments
    {
        get
        {
            return departments;
        }
        set
        {
            departments = value;
            OnPropertyChanged("Departments");
        }
    }

    public void myTreeViewCommand(string par) 
    {
        Console.ReadKey();
    }
}
2
Filip Filipovic 14 grudzień 2019, 20:28

1 odpowiedź

Najlepsza odpowiedź

Ponieważ TreeViewCommand znajduje się w zasięgu treeview, ma obiekt departamentów, ponieważ jest to DataContext Dlatego nie może znaleźć polecenia. Powinieneś wyraźnie zdefiniować DataContext, w którym zdefiniowano Twój TreeViewCommand. Wykonaj następujące czynności:

<!-- Note the ElementName and Path=DataContext. -->
<Button Command="{Binding ElementName=MainTreeView, Path=DataContext.TreeViewCommand}" CommandParameter="{Binding DepartmentName}" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
    <Label Content="{Binding DepartmentName}"/>
</Button>

Xaml dla wszystkich twoich węzłów:

<TreeView x:Name="MainTreeView" HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch" ItemsSource="{Binding Departments}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Positions}">
            <Button Command="{Binding ElementName=MainTreeView, Path=DataContext.TreeViewCommand}" CommandParameter="{Binding DepartmentName}" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
                <Label Content="{Binding DepartmentName}"/>
            </Button>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Employees}">
                    <Button Command="{Binding ElementName=MainTreeView, Path=DataContext.TreeViewCommand}" CommandParameter="{Binding PositionName}" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
                        <Label Content="{Binding PositionName}"/>
                    </Button>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <Button Command="{Binding ElementName=MainTreeView, Path=DataContext.TreeViewCommand}" CommandParameter="{Binding EmployeeName}" BorderThickness="0" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" >
                                <Label Content="{Binding EmployeeName}"/>
                            </Button>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Uwaga! Jeśli w końcu będziesz chciał przejść obiekty zamiast ciągów (nazwy twoich węzłów), musisz zdefiniować IMMmands dla każdego przycisku.

1
Gleb 14 grudzień 2019, 17:59