簡體   English   中英

我如何綁定到XmlDataProvider,誰的源設置了默認名稱空間(xmlns)?

[英]How do I bind to XmlDataProvider whos source has a default namespace (xmlns) set?

我有類似以下內容的XML

<?xml version="1.0" encoding="utf-8"?>
<foo name="FooBar" xmlns="http://mydomain/myapp/ver/myschema.xsd">
    <bars v="test">
        <bar bat="one"/>
        <bar bat="two"/>
        <bar bat="three"/>
    </bars>
</foo>

我如何在WPF中對此進行映射,如果不設置默認名稱空間,它可以工作,但是當我設置xmlns我的綁定不匹配任何內容。 我已經嘗試了以下聲明,但是在確定如何映射組合框時遇到了麻煩,如下所示。

<Window.Resources>
    <!-- works if xmlns is not set -->
    <XmlDataProvider x:Key="mySource1"
                     XPath="/foo">
    <!-- also tried -->
    <XmlDataProvider x:Key="mySource2"
                     XPath="//*[local-name()='foo']">
    <!-- also tried -->
    <XmlDataProvider x:Key="mySource3"
                     XPath="/foo">
        <XmlDataProvider.XmlNamespaceManager>
            <XmlNamespaceMappingCollection>
                <XmlNamespaceMapping
                    Uri="http://mydomain/myapp/ver/myschema.xsd"
                    Prefix=""/>
            </XmlNamespaceMappingCollection>
        </XmlDataProvider.XmlNamespaceManager>
    </XmlDataProvider>
</Window.Resources>

<StackPanel DataContext="{StaticResource mySource1}">
    <Label Content="{Binding XPath=@name}"/>
    <Label DataContext="{Binding XPath=bars}"
           Content="{Binding XPath=@v}"/>
</StackPanel>

我通過以下代碼分配XmlDataProvider.Source屬性。

XmlDataProvider xdp = FindResource("mySource1") as XmlDataProvider;
// ... setup dialog and confirm resource.
using (Stream s = dlg.OpenFile()) {
    XmlDocument doc = new XmlDocument();
    doc.Load(s);
    xdp.Document = doc;
}

非常感謝您對解決此問題的任何幫助。

更新

根據安德魯斯的建議,我提出了以下建議:

<Window.Resources>
    <XmlDataProvider x:Key="mySource"
                     XPath="/fb:foo">
        <XmlDataProvider.XmlNamespaceManager>
            <XmlNamespaceMappingCollection>
                <XmlNamespaceMapping
                    Uri="http://mydomain/myapp/ver/myschema.xsd"
                    Prefix="fb"/>
            </XmlNamespaceMappingCollection>
        </XmlDataProvider.XmlNamespaceManager>
    </XmlDataProvider>
</Window.Resources>

<StackPanel DataContext="{StaticResource mySource}">
    <Label Content="{Binding XPath=@name}"/>
    <ComboBox ItemsSource="{Binding XPath=fb:bars/fb:bar}"
              IsSynchronizedWithCurrentItem="True">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding XPath=@bat}" />
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</StackPanel>

你可以試試這個嗎? 我對xml名稱空間不太熟悉。

<Window.Resources>
    <!-- also tried -->
    <XmlDataProvider x:Key="mySource3"
                     XPath="/cs:foo">
        <XmlDataProvider.XmlNamespaceManager>
            <XmlNamespaceMappingCollection>
                <XmlNamespaceMapping
                    Uri="http://mydomain/myapp/ver/myschema.xsd"
                    Prefix="cs"/>
            </XmlNamespaceMappingCollection>
        </XmlDataProvider.XmlNamespaceManager>
    </XmlDataProvider>
</Window.Resources>

<StackPanel DataContext="{StaticResource mySource1}">
    <Label Content="{Binding XPath=@name}"/>
    <Label Content="{Binding XPath=cs:bat}"/>
</StackPanel>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM