如何解决MVVM不会在TreeView中显示C#ObservableCollection
所以我有一个包含Name
,Code
,Id
和List
的集合,其节点类型为ServiceTypeDto
,如下所示:
public class ServiceTypeDto
{
public long Id
public string Code
public string Name
public List<ServiceTypeDto> ChildrenList
}
我有一个方法可以返回ServiceTypeDto
的列表,像这样:
我有一个ChildernList
公开了ServiceTypeDto
s。
这是我尝试在 ViewModel 中进行的操作:
using System.Collections.Generic;
using System.Collections.ObjectModel;
using ServiceTypeService.Dto;
using ServiceTypeService.Interface;
using ShowServiceType.Interfaces;
using ShowServiceType.Utils;
namespace ShowServiceType.ViewModel
{
class MainWindowViewModel : ViewModelBase
{
public string _name,_code;
public long _id;
public List<ServiceTypeDto> _childrenList = new List<ServiceTypeDto>();
/// <summary>
/// Create Services for work
/// </summary>
ILogService Log => Service.CreateLog();
IExceptionHandler ExceptionHandler => Service.CreateExeptionHandler();
IServiceType ServiceType => Service.CreateGetServiceType();
public ObservableCollection<ServiceTypeDto> _servicesCollection;
public MainWindowViewModel()
{
ServiceConfig.Initialization();
var _services = ServiceType.GetServiceTypesTree();
_servicesCollection = new ObservableCollection<ServiceTypeDto>();
//This is convert to ObservableCollection my List<> =)
foreach (var item in _services)
_servicesCollection.Add(item);
}
public long ID
{
get => _id;
set
{
_id = value;
OnPropertyChanged("ID");
}
}
public string Code
{
get => _code;
set
{
_code = value;
OnPropertyChanged("Code");
}
}
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged("Name");
}
}
public List<ServiceTypeDto> Children
{
get => _childrenList;
set
{
_childrenList = value;
OnPropertyChanged("Children");
}
}
}
}
我的ViewModelBase
类型:
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged( string propname ) => PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(propname));
}
主窗口后面的代码:
public MainWindow()
{
InitializeComponent();
ServiceConfig.Initialization();
DataContext = new MainWindowViewModel();
}
最后,这是视图的XAML。
<Grid Grid.Row="1">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible">
<TreeView>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
<StackPanel FlowDirection="LeftToRight" Orientation="Horizontal">
<TextBlock Text="{Binding ID}" />
<TextBlock Text="{Binding Code}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</ScrollViewer>
</Grid>
ObservableCollection
没有出现在TreeView
中。怎么了?
解决方法
您的视图和视图模型存在多个问题:
-
TreeView
未绑定任何内容,请将其ItemSource
绑定到Children
,否则将不显示任何项目 -
ItemsSource
中的HierarchicalDataTemplate
必须绑定到您的ServiceTypeDto
而非ChildrenList
的{{1}}中的子集合中。 - 您没有填充
Children
集合(或其后备集合Children
),因此它为空。 - 您将项目添加到
_childrenList
,但也未使用 -
_servicesCollection
未实现ServiceTypeDto
,因此属性更改不会反映在用户界面中 -
ChildrenList
不是ServiceTypeDto
,因此添加或删除项也不会反映在用户界面中
INotifyPropertyChanged
中的您应该考虑为属性使用ObservableCollection
之类的命名约定,并为支持字段使用Children
之类的命名约定,以提高代码的可读性,请查阅here作为C#命名的参考。 / p>
1)好吧,我将TreeView.ItemSource
绑定到ChildrenList
2)我不理解如何将集合ChildList
中的ServiceTypeDto
绑定到ObserveCollection
,如何理解在UI中选择的索引?
public List<ServiceTypeDto> ChildrenList
{
get => _servicesCollection[0].ChildrenList; // ? index ?
set
{
_servicesCollection[0].ChildrenList = value; // ? 0 ?
OnPropertyChanged("ChildrenList");
}
}
public string Name
{
get => _servicesCollection[0].Name; // ? 0 ?
set
{
_servicesCollection[0].Name = value; // ?
OnPropertyChanged("Name");
}
}
其他属性必须知道要从_servicesCollection[index].Name
正确数据中请求的索引吗?
3)我无法根据任务条件将DLL中的ChildrenList
中的ServiceTypeDto
更改为ObserveCollection
。
这只是参考。
在此之后,我不知道如何操作,但它在0索引下工作! 但是只能工作的第一个节点不会在subList中出现其他列表
<Grid Grid.Row="1">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible">
<TreeView ItemsSource="{Binding Path=ChildrenList}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=ChildrenList}">
<StackPanel FlowDirection="LeftToRight" Orientation="Horizontal">
<TextBlock Text="{Binding ID}" />
<TextBlock Text="{Binding Code}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</ScrollViewer>
</Grid>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。