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
WPF TreeView:如何从不同模型创建头和节点_Wpf_Mvvm - Fatal编程技术网

WPF TreeView:如何从不同模型创建头和节点

WPF TreeView:如何从不同模型创建头和节点,wpf,mvvm,Wpf,Mvvm,我正在进行一个wpf项目,在这个项目中,我必须递归地构建树节点。我想做的是为另一个模型中的节点分配头,例如: Request Header --> node1 -->node1.1 -->node1.2 Response Header -->node2 -->node2.1 -->node2.2 // buil

我正在进行一个wpf项目,在这个项目中,我必须递归地构建树节点。我想做的是为另一个模型中的节点分配头,例如:

    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您能告诉我更多详细信息吗?例如,如果您想区分不同类型的节点,最简单的方法是为每种类型的节点提供不同的类型,然后为每种节点类型创建不同的数据模板。你指的是我所说的请求和响应根吗?我能在代码示例中看到它吗?我找到了一种解决方法,我将很快发布解决方案