Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从UserControl(XAML、C#、TreeView)访问类方法_C#_Wpf_Xaml_Namespaces_Treeview - Fatal编程技术网

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

从UserControl(XAML、C#、TreeView)访问类方法,c#,wpf,xaml,namespaces,treeview,C#,Wpf,Xaml,Namespaces,Treeview,我尝试在TreeViewModel.TreeViewItem\u中添加一个方法: public void TreeViewItem_Expanded(object sender, RoutedEventArgs e) { TreeViewItem item = e.Source as TreeViewItem; if ((item.Items.Count == 1) && (item.Items[0] is stri

我尝试在TreeViewModel.TreeViewItem\u中添加一个方法:

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 { }
            }
        }
要在xaml中查看树视图,请执行以下操作:

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

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

但也没有起作用。错误:


答案已更新:

好的,下面是完整的答案:

XAML:


视图模型:

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);
    }
}
public类主视图模型
{
公共ObservableCollection项{get;}=new ObservableCollection();
公共主视图模型()
{
foreach(driveInfo.GetDrives()中的var driveInfo)
{
添加(新的DriveTreeViewItemModel(driveInfo));
}
}
}
公共抽象类TreeViewItemModel
{
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
专用ICommand _expandedCommand;
私人住宅被扩展;
公共字符串名称{get;}
公共图书馆被扩展了
{
得到
{
返回已扩展;
}
设置
{
TreeViewItemExpanded();
_isExpanded=值;
OnPropertyChanged(名称(IsExpanded));
}
}
公共TreeViewModel(字符串名称)
{
名称=名称;
}
公共ObservableCollection项{get;}=new ObservableCollection();
受保护的抽象void TreeViewItemExpanded();
受保护的无效OnTreeViewItemExpanded(目录信息)
{
Items.Clear();
foreach(info.GetDirectories()中的DirectoryInfo子目录)
{
添加(新的DirectoryTreeViewItemModel(subDir));
}
}
}
公共类DummyTreeViewItemModel:TreeViewItemModel
{
公共DummyTreeViewModel():base(string.Empty)
{
}
受保护的覆盖无效TreeViewItemExpanded()
{
}
}
公共类目录TreeViewItemModel:TreeViewItemModel
{
public directoryTreeViewItemModel(DirectoryInfo目录):base(directory.Name)
{
目录=目录;
添加(新的DummyTreeViewItemModel());
}
public DirectoryInfo目录{get;}
受保护的覆盖无效TreeViewItemExpanded()
{
OnTreeViewItemExpanded(目录);
}
}
公共类DriveTreeViewItemModel:TreeViewItemModel
{
公共驱动器TreeViewItemModel(驱动器信息驱动器):基本(驱动器名)
{
驱动=驱动;
添加(新的DirectoryTreeViewItemModel(Drive.RootDirectory));
}
公共驱动器信息驱动器{get;}
受保护的覆盖无效TreeViewItemExpanded()
{
OnTreeViewItemExpanded(Drive.RootDirectory);
}
}

MainViewModel
是一个树状视图日期上下文。希望你能成功。

答案已更新:

好的,下面是完整的答案:

XAML:


视图模型:

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);
    }
}
public类主视图模型
{
公共ObservableCollection项{get;}=new ObservableCollection();
公共主视图模型()
{
foreach(driveInfo.GetDrives()中的var driveInfo)
{
添加(新的DriveTreeViewItemModel(driveInfo));
}
}
}
公共抽象类TreeViewItemModel
{
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
专用ICommand _expandedCommand;
私人住宅被扩展;
公共字符串名称{get;}
公共图书馆被扩展了
{
得到
{
返回已扩展;
}
设置
{
TreeViewItemExpanded();
_isExpanded=值;
OnPropertyChanged(名称(IsExpanded));
}
}
公共TreeViewModel(字符串名称)
{
名称=名称;
}
公共ObservableCollection项{get;}=new ObservableCollection();
受保护的抽象void TreeViewItemExpanded();
受保护的无效OnTreeViewItemExpanded(目录信息)
{
Items.Clear();
foreach(info.GetDirectories()中的DirectoryInfo子目录)
{
添加(新的DirectoryTreeViewItemModel(subDir));
}
}
}
公共类DummyTreeViewItemModel:TreeViewItemModel
{
公共DummyTreeViewModel():base(string.Empty)
{
}
受保护的覆盖无效TreeViewItemExpanded()
{
}
}
公共类目录TreeViewItemModel:TreeViewItemModel
{
public directoryTreeViewItemModel(DirectoryInfo目录):base(directory.Name)
{
目录=目录;
添加(新的DummyTreeViewItemModel());
}
public DirectoryInfo目录{get;}
受保护的覆盖无效TreeViewItemExpanded()
{
OnTreeViewItemExpanded(目录);
}
}
公共类DriveTreeViewItemModel:TreeViewItemModel
{
公共驱动器TreeViewItemModel(驱动器信息驱动器):基本(驱动器名)
{
驱动=驱动;
添加(新的DirectoryTreeViewItemModel(Drive.RootDirectory));
}
公共驱动器信息驱动器{get;}
受保护的覆盖无效TreeViewItemExpanded()
{
OnTreeViewItemExpanded(Drive.RootDirectory);
}
}

MainViewModel
是一个树状视图日期上下文。希望你能成功。

什么不成功?您是否遇到异常(编译器/运行时错误)?绑定错误(检查输出窗口)?从错误中添加的屏幕:“Treemodels.TreeViewModel.TreeViewItem_Expanded”不是有效的事件处理程序方法名称。只有生成的类或代码隐藏类上的实例方法有效。事件处理程序通常位于
xaml.cs中<
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);
    }
}