繁体   English   中英

从UserControl(XAML,C#,TreeView)访问类方法

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

我尝试将一种方法添加到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 { }
            }
        }

将TreeView转换为xaml:

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

我也尝试添加名称空间:

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

接着:

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

但是也没有用。 错误:

在此处输入图片说明

答案已更新:

好的,这是完整答案:

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是一个TreeView DateContext。 希望你能使它工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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