WPF TreeView:如何从不同模型创建头和节点
我正在进行一个wpf项目,在这个项目中,我必须递归地构建树节点。我想做的是为另一个模型中的节点分配头,例如:WPF TreeView:如何从不同模型创建头和节点,wpf,mvvm,Wpf,Mvvm,我正在进行一个wpf项目,在这个项目中,我必须递归地构建树节点。我想做的是为另一个模型中的节点分配头,例如: Request Header --> node1 -->node1.1 -->node1.2 Response Header -->node2 -->node2.1 -->node2.2 // buil
Request Header --> node1
-->node1.1
-->node1.2
Response Header -->node2
-->node2.1
-->node2.2
// building tree
public List<TreeModel> BuildTree(IEnumerable<string> strings)
{
return (
from s in strings
let split = s.Split('.')
group s by s.Split('.')[0] into g
select new TreeModel
{
Value = g.Key,
Children = BuildTree(
from s in g
where s.Length > g.Key.Length + 1
select s.Substring(g.Key.Length + 1))
}
).ToList();
}
// Here I am creating static MessageElementModel objects
<HierarchicalDataTemplate DataType="{x:Type local:TreeViewModel}" ItemsSource="{Binding Children}">
<CheckBox IsChecked="{Binding Value}" Content="{Binding Value}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
How can I add header from another model? for this case transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType and transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType to the treeview for the nodes I am creating in the TreeNode.BuildTree(request) recursively?
and the same for var response;
var treeNode = new ObservableCollection<TransactionTypeViewModel>() { request, response };
}
return treeNode;
}
In the messageElementViewModel I am getting the constructed nods(TreeNodeModel)+roots(TransactionTypeViewModel)
here I addded Id so that when I chose any transaction from my Transaction combobox the tree will display only matching Ids
public List<MessageElementViewModel> GetAllTreeNodesList()
{
messageElements = TransactionType.getAllTreeNodes().Select(msgElements => new MessageElementViewModel
{
Id = msgElements.Id,
Request = msgElements.Request,
Response = msgElements.Response,
}).ToList();
return messageElements;
}
//make it observable
public ObservableCollection<MessageElementViewModel> GetAllTreeNodes()
{
observableMessageElement = new ObservableCollection<MessageElementViewModel> (messageElements);
return observableMessageElement;
}
//xaml binding to MessageElementViewModel where I have the roots and nodes combination
How can I bind all these together in the xaml?
请求头-->节点1
-->节点1.1
-->节点1.2
响应头-->节点2
-->节点2.1
-->节点2.2
//建树
公共列表构建树(IEnumerable字符串)
{
返回(
从字符串中的
设split=s.split('.'))
按s分组。将('.')[0]拆分为g
选择新建树模型
{
值=g.键,
Children=BuildTree(
从s到g
其中s.长度>g.键长度+1
选择s.Substring(g.Key.Length+1))
}
).ToList();
}
//这里我创建的是静态MessageElementModel对象
我之所以要创建这些对象,是因为我想将它们与另一个控件(combobox)关联,以便在选择事件时创建,但这不是我的问题的一部分
public List<MessageElementModel> GetAllMessageElements()
{
string[] request = { "NetworkControl.AlternateIndexText.Value" };
string[] request2 = { "NetworkControl.NetworkControl.AddressData.TransactionOriginatorID.Value" };
string[] request3 = { "VehicleSummary.VehicleIdentification.IdentificationID.Value" };
transactionTypeWSRequestXmlType = TransactionTypeModle.TransactionTypeWSRequestXmlType;
transactionTypeWSResponseXmlType = TransactionTypeModel.TransactionTypeWSRequestXmlType;
messageElements.Add(new MessageElementModel(1, transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType, TreeNode.BuildTree(request)));
messageElements.Add(new MessageElementModel(1, transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType, TreeNode.BuildTree(request2)));
return messageElements;
}
The transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType and transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType are the headers of the tree (TreeNode.BuildTree(request))
<HierarchicalDataTemplate DataType="{x:Type local:TreeViewModel}" ItemsSource="{Binding Children}">
<CheckBox IsChecked="{Binding Value}" Content="{Binding Value}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
How can I add header from another model? for this case transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType and transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType to the treeview for the nodes I am creating in the TreeNode.BuildTree(request) recursively?
and the same for var response;
var treeNode = new ObservableCollection<TransactionTypeViewModel>() { request, response };
}
return treeNode;
}
In the messageElementViewModel I am getting the constructed nods(TreeNodeModel)+roots(TransactionTypeViewModel)
here I addded Id so that when I chose any transaction from my Transaction combobox the tree will display only matching Ids
public List<MessageElementViewModel> GetAllTreeNodesList()
{
messageElements = TransactionType.getAllTreeNodes().Select(msgElements => new MessageElementViewModel
{
Id = msgElements.Id,
Request = msgElements.Request,
Response = msgElements.Response,
}).ToList();
return messageElements;
}
//make it observable
public ObservableCollection<MessageElementViewModel> GetAllTreeNodes()
{
observableMessageElement = new ObservableCollection<MessageElementViewModel> (messageElements);
return observableMessageElement;
}
//xaml binding to MessageElementViewModel where I have the roots and nodes combination
How can I bind all these together in the xaml?
公共列表GetAllMessageElements()
{
字符串[]请求={“NetworkControl.alternateIndextextext.Value”};
字符串[]request2={“NetworkControl.NetworkControl.AddressData.TransactionOriginatorID.Value”};
字符串[]request3={“VehicleSummary.VehicleIdentification.IdentificationID.Value”};
transactionTypeWSRequestXmlType=TransactionTypeModle.transactionTypeWSRequestXmlType;
transactionTypeWSResponseXmlType=TransactionTypeModel.TransactionTypeWSRequestXmlType;
添加(新的MessageElementModel(1,transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType,TreeNode.BuildTree(请求));
添加(新的MessageElementModel(1,transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType,TreeNode.BuildTree(request2));
返回消息元素;
}
transactionTypeWSRequestXmlType、transactionTypeWSResponseXmlType和transactionTypeWSRequestXmlType、transactionTypeWSResponseXmlType是树(TreeNode.BuildTree(请求))的头
在我的XAML中
<HierarchicalDataTemplate DataType="{x:Type local:TreeViewModel}" ItemsSource="{Binding Children}">
<CheckBox IsChecked="{Binding Value}" Content="{Binding Value}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
How can I add header from another model? for this case transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType and transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType to the treeview for the nodes I am creating in the TreeNode.BuildTree(request) recursively?
and the same for var response;
var treeNode = new ObservableCollection<TransactionTypeViewModel>() { request, response };
}
return treeNode;
}
In the messageElementViewModel I am getting the constructed nods(TreeNodeModel)+roots(TransactionTypeViewModel)
here I addded Id so that when I chose any transaction from my Transaction combobox the tree will display only matching Ids
public List<MessageElementViewModel> GetAllTreeNodesList()
{
messageElements = TransactionType.getAllTreeNodes().Select(msgElements => new MessageElementViewModel
{
Id = msgElements.Id,
Request = msgElements.Request,
Response = msgElements.Response,
}).ToList();
return messageElements;
}
//make it observable
public ObservableCollection<MessageElementViewModel> GetAllTreeNodes()
{
observableMessageElement = new ObservableCollection<MessageElementViewModel> (messageElements);
return observableMessageElement;
}
//xaml binding to MessageElementViewModel where I have the roots and nodes combination
How can I bind all these together in the xaml?
<HierarchicalDataTemplate DataType="{x:Type local:TreeViewModel}" ItemsSource="{Binding Children}">
<CheckBox IsChecked="{Binding Value}" Content="{Binding Value}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
How can I add header from another model? for this case transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType and transactionTypeWSRequestXmlType,transactionTypeWSResponseXmlType to the treeview for the nodes I am creating in the TreeNode.BuildTree(request) recursively?
and the same for var response;
var treeNode = new ObservableCollection<TransactionTypeViewModel>() { request, response };
}
return treeNode;
}
In the messageElementViewModel I am getting the constructed nods(TreeNodeModel)+roots(TransactionTypeViewModel)
here I addded Id so that when I chose any transaction from my Transaction combobox the tree will display only matching Ids
public List<MessageElementViewModel> GetAllTreeNodesList()
{
messageElements = TransactionType.getAllTreeNodes().Select(msgElements => new MessageElementViewModel
{
Id = msgElements.Id,
Request = msgElements.Request,
Response = msgElements.Response,
}).ToList();
return messageElements;
}
//make it observable
public ObservableCollection<MessageElementViewModel> GetAllTreeNodes()
{
observableMessageElement = new ObservableCollection<MessageElementViewModel> (messageElements);
return observableMessageElement;
}
//xaml binding to MessageElementViewModel where I have the roots and nodes combination
How can I bind all these together in the xaml?
如何从其他模型添加标题?对于这种情况,是否将transactionTypeWSRequestXmlType、transactionTypeWSResponseXmlType和transactionTypeWSRequestXmlType、transactionTypeWSResponseXmlType递归地添加到我在TreeNode.BuildTree(请求)中创建的节点的树视图?
var响应也是如此;
var treeNode=新的observeCollection(){request,response};
}
返回树节点;
}
在messageElementViewModel中,我得到构造的节点(TreeNodeModel)+根(TransactionTypeViewModel)
在这里我添加了Id,这样当我从我的事务组合框中选择任何事务时,树将只显示匹配的Id
公共列表getAllTreeNodeList()
{
messageElements=TransactionType.getAllTreeNodes().Select(msgElements=>new MessageElementViewModel
{
Id=msgElements.Id,
Request=msgElements.Request,
响应=msgElements.Response,
}).ToList();
返回消息元素;
}
//使其可见
公共可观测集合GetAllTreeNodes()
{
observableMessageElement=新的ObservableCollection(messageElements);
返回可观察的消息元素;
}
//xaml绑定到MessageElementViewModel,其中我有根和节点组合
如何将所有这些绑定到xaml中?
创建视图绑定到的单个ViewModel,然后使用此ViewModel“包装”模型。HighCore您能告诉我更多详细信息吗?例如,如果您想区分不同类型的节点,最简单的方法是为每种类型的节点提供不同的类型,然后为每种节点类型创建不同的数据模板。你指的是我所说的请求和响应根吗?我能在代码示例中看到它吗?我找到了一种解决方法,我将很快发布解决方案