从UserControl(XAML、C#、TreeView)访问类方法
我尝试在TreeViewModel.TreeViewItem\u中添加一个方法:从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
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);
}
}