0

からサブクラス化するXElementと、要素名を として使用するDataTemplateために機能する は、サブクラスでは機能しません。何か案が?XElementDataType

<HierarchicalDataTemplate DataType="grupo" ItemsSource="{Binding Path=Elements}">
        <TextBlock Text="{Binding Path=Attribute[name]}" />
</HierarchicalDataTemplate>
<!-- When I build an XDocument with XElements like this the template gets applied -->
XDocument _xdoc=XDocument.Load(@"RosterData1.xml");
treeRoster.DataContext = _xdoc;     
<TreeView Name="treeRoster" ItemsSource={Binding Path=Root.Elements}>
</TreeView>  
<!-- but if build de XDocument like this the DataTemplate doesn't apply -->
XDocument _xdoc=XDocument.Load(@"RosterData1.xml");
XDocument docOther = new XDocument(new XElement("contactos"));
var grupos = _xdoc.Descendants("grupo").Select(g => new Grupo(g));
docOther.Root.Add(grupos.ToArray());
var contactos = _xdoc.Root.Elements("contacto").ToList();
docOther.Root.Add(contactos);
treeRoster.DataContext = docOther;  
<!-- The xml file is like that:
<contactos>
  <grupo name="Amigotes">
    <contacto jid="batman@jabber.org" subscription="none" />
    <contacto jid="trucoman@jabber-hispano.org" subscription="both" name="truco" />
    <contacto jid="mmakinavaja@gmail.com" subscription="none" name="mmakinavaja" />
    <contacto jid="ramon@jabber-hispano.org" subscription="both" name="Ramon" />
 </grupo>
 <grupo name="Lannisters">
    <contacto jid="jamie@jabberes.org" subscription="none" />
 </grupo>
 <contacto jid="tyrion@jabber.org" subscription="none" />
   <contacto jid="nslbot@jabber.org" subscription="none" />
   <contacto jid="nslbot@jabberes.org" subscription="none" />
</contactos> -->  
4

1 に答える 1

0

機能しない理由はわかっていますが、なぜこのように実装されているのかわかりません。メソッド " " のコードをリフレクターで見るとFindTemplateResourceInternal、答えが見つかりました。

Type baseType = item.GetType();
if ((baseType.FullName == "System.Xml.Linq.XElement") && 
((obj2 = GetXLinqTagName(item, baseType)) != null))
{
    baseType = null;
}

わかりました、私のクラスのフルネームが ではないことは理解していSystem.Xml.Linq.XElementます。しかし後で、「while」の中にいると:

while (obj2 != null)
{
    object obj3 = null;
    if (templateType == typeof(DataTemplate))
    {
        obj3 = new DataTemplateKey(obj2);
    }
    if (obj3 != null)
    {
        keys.Add(obj3);
    }
    if (exactMatch == -1)
    {
        exactMatch = keys.Count;
    }
    if (baseType != null)
    {
        baseType = baseType.BaseType;
        //HERE baseType FullName is XElement
        //Why don't check it again??
        if (baseType == typeof(object))
        {
            baseType = null;
        }
    }
    obj2 = baseType;
}

このループ内で、 after"baseType=baseType.BaseType"を再度確認するFullNameと... ですが、代わりにwith ...XElementを探しています。DataTemplateDataType={x:Type XElement}

于 2009-04-23T10:18:31.280 に答える