2010-05-10 3 views
1

기본값 인을 XmlDataProvider 및 XPath 바인딩과 함께 사용하는 방법을 알아 내려고 노력하고 있습니다.XmlDataProvider 및 XPath 바인딩에서 XML 데이터의 기본 네임 스페이스를 허용하지 않습니까?

로컬 이름이 <Binding XPath="*[local-name()='Name']" />ugly answer이 있지만이 XAML을 고도로 유지 관리하기를 원하는 클라이언트는 받아 들일 수 없습니다.

대체로 보고서 XML에서 기본이 아닌 네임 스페이스를 사용하도록 강제하는 것이 바람직하지 않은 해결책입니다.

XML 보고서 파일은 다음과 같습니다. 기본 네임 스페이스가 없도록 xmlns="http://www.acme.com/xml/schemas/report을 제거한 경우에만 작동합니다. 내가 XAML과 창에 제시하고

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type='text/xsl' href='PreviewReportImages.xsl'?> 
<Report xsl:schemaLocation="http://www.acme.com/xml/schemas/report BlahReport.xsd" xmlns:xsl="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.acme.com/xml/schemas/report"> 
    <Service>Muncher</Service> 
    <Analysis> 
    <Date>27 Apr 2010</Date> 
    <Time>0:09</Time> 
    <Authoriser>Service Centre Manager</Authoriser> 

는 :

코드 뒤에 XmlDataProvider (에 XmlDocument를로드하는 데 사용과
<Window x:Class="AcmeTest.ReportPreview" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="ReportPreview" Height="300" Width="300" > 
    <Window.Resources> 
     <XmlDataProvider x:Key="Data"/> 
    </Window.Resources> 
    <StackPanel Orientation="Vertical" DataContext="{Binding Source={StaticResource Data}, XPath=Report}"> 
     <TextBlock Text="{Binding XPath=Service}"/> 
    </StackPanel> 
</Window> 

는 파일의 로딩을하거나 다양한 개체 수있는 유일한 방법을 보인다 런타임시). 내가 때 단지 명백한 (기본 네임 스페이스와 같은 URI에 매핑 내 XPath 식에 접두사를 사용, 클라이언트 XML 데이터에 접두사를 추가 할 필요가 없습니다 실현하지 않았다

public partial class ReportPreview : Window 
{ 
    private void InitXmlProvider(XmlDocument doc) 
    { 
     XmlDataProvider xd = (XmlDataProvider)Resources["Data"]; 
     xd.Document = doc; 
    } 

    public ReportPreview(XmlDocument doc) 
    { 
     InitializeComponent(); 
     InitXmlProvider(doc); 
    } 

    public ReportPreview(String reportPath) 
    { 
     InitializeComponent(); 

     var doc = new XmlDocument(); 
     doc.Load(reportPath); 
     InitXmlProvider(doc); 
    } 
} 
+1

테스트하지 않으면 바인딩의 일부로 XmlNamespaceManager를 사용할 수 있어야합니다. 접두사를 사용해야하지만 작동해야합니다. – p00ya

+0

그래, 접두사를 강제로 내 fallback이지만 많은 XSLT 외부 스크립트는 기본 네임 스페이스에 만족해야 변경해야합니다. –

+0

doh - 아래 내 대답을 참조하십시오! –

답변

2

그것 위에서 잤다!).

그래서 여기에 표시된대로 네임 스페이스 매핑을 추가하는 것이 수정되었습니다. 요소에 r : 접두어를 사용합니다.

<Window x:Class="AcmeTest.ReportPreview" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="ReportPreview" Height="300" Width="300" > 
    <Window.Resources> 
     <XmlDataProvider x:Key="Data"> 
      <XmlDataProvider.XmlNamespaceManager> 
       <XmlNamespaceMappingCollection> 
        <XmlNamespaceMapping 
         Uri="http://www.acme.com/xml/schemas/report" 
         Prefix="r" /> 
       </XmlNamespaceMappingCollection> 
      </XmlDataProvider.XmlNamespaceManager> 
     </XmlDataProvider> 
    </Window.Resources> 
    <StackPanel Orientation="Vertical" DataContext="{Binding Source={StaticResource Data}, XPath=Report}"> 
     <TextBlock Text="{Binding XPath=r:Service}"/> 
     <TextBlock Text=" "/> 
     <TextBlock Text="{Binding XPath=r:Name/r:Last}"/> 
    </StackPanel> 
</Window>