简体   繁体   中英

Access to class method from UserControl (XAML, C#, TreeView)

I try to add one method located into TreeViewModel.TreeViewItem_Expanded:

public void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = e.Source as TreeViewItem;
            if ((item.Items.Count == 1) && (item.Items[0] is string))
            {
                item.Items.Clear();

                DirectoryInfo expandedDir = null;
                if (item.Tag is DriveInfo)
                    expandedDir = (item.Tag as DriveInfo).RootDirectory;
                if (item.Tag is DirectoryInfo)
                    expandedDir = (item.Tag as DirectoryInfo);
                try
                {
                    foreach (DirectoryInfo subDir in expandedDir.GetDirectories())
                        item.Items.Add(CreateTreeItem(subDir));
                }
                catch { }
            }
        }

to TreeView into xaml:

 <Grid Background="MidnightBlue">
    <TreeView Name="trvStructure" TreeViewItem.Expanded="TreeViewModel.TreeViewItem_Expanded" Margin="20" />
 </Grid>

I tried also to add namespace:

 xmlns:Treemodels="clr-namespace:LayoutMVVM.ViewModels"

and then:

<TreeView Name="trvStructure" TreeViewItem.Expanded="Treemodels.TreeViewModel.TreeViewItem_Expanded" Margin="20" />

But also did not work. Error:

在此处输入图片说明

Answer is updated:

OK, here is the full answer:

XAML:

<TreeView Name="trvStructure" Margin="20" ItemsSource="{Binding Items}">
        <TreeView.Resources>
            <Style TargetType="TreeViewItem">
                <Setter Property="Header" Value="{Binding Name}"/>
                <Setter Property="ItemsSource" Value="{Binding Items}"/>
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
            </Style>
        </TreeView.Resources>
</TreeView>

ViewModel:

public class MainViewModel
{
    public ObservableCollection<TreeViewItemViewModel> Items { get; } = new ObservableCollection<TreeViewItemViewModel>();
    public MainViewModel()
    {
        foreach (var driveInfo in DriveInfo.GetDrives())
        {
            Items.Add(new DriveTreeViewItemViewModel(driveInfo));
        }
    }
}

public abstract class TreeViewItemViewModel
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private ICommand _expandedCommand;

    private bool _isExpanded;

    public string Name { get; }

    public bool IsExpanded
    {
        get
        {
            return _isExpanded;
        }
        set
        {
            TreeViewItemExpanded();
            _isExpanded = value;
            OnPropertyChanged(nameof(IsExpanded));
        }
    }

    public TreeViewItemViewModel(string name)
    {
        Name = name;
    }

    public ObservableCollection<TreeViewItemViewModel> Items { get; } = new ObservableCollection<TreeViewItemViewModel>();

    protected abstract void TreeViewItemExpanded();

    protected void OnTreeViewItemExpanded(DirectoryInfo info)
    {
        Items.Clear();

        foreach (DirectoryInfo subDir in info.GetDirectories())
        {
            Items.Add(new DirectoryTreeViewItemViewModel(subDir));
        }
    }
}

public class DummyTreeViewItemViewModel : TreeViewItemViewModel
{
    public DummyTreeViewItemViewModel() : base(string.Empty)
    {
    }

    protected override void TreeViewItemExpanded()
    {
    }
}

public class DirectoryTreeViewItemViewModel : TreeViewItemViewModel
{
    public DirectoryTreeViewItemViewModel(DirectoryInfo directory) : base(directory.Name)
    {
        Directory = directory;
        Items.Add(new DummyTreeViewItemViewModel());
    }

    public DirectoryInfo Directory { get; }


    protected override void TreeViewItemExpanded()
    {
        OnTreeViewItemExpanded(Directory);
    }
}

public class DriveTreeViewItemViewModel : TreeViewItemViewModel
{
    public DriveTreeViewItemViewModel(DriveInfo drive) : base(drive.Name)
    {
        Drive = drive;
        Items.Add(new DirectoryTreeViewItemViewModel(Drive.RootDirectory));
    }

    public DriveInfo Drive { get; }

    protected override void TreeViewItemExpanded()
    {
        OnTreeViewItemExpanded(Drive.RootDirectory);
    }
}

MainViewModel is a TreeView DateContext. Hope you can make it work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM