0

Asp.Net アプリケーションで読み取った XAML ドキュメントを解析し、それを解析して、ループしながら各列の Converter 値を取得する必要があります。

これは、私の XML (XAML) がどのように見えるかです。

<Presentation>
        <Columns>
            <mux:ColumnCollection xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="http://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:datebinding="clr-namespace:Microsoft.EnterpriseManagement.UI.Extensions;assembly=Microsoft.EnterpriseManagement.UI.Extensions" xmlns:data="clr-namespace:Microsoft.EnterpriseManagement.UI.Extensions;assembly=Microsoft.EnterpriseManagement.UI.Extensions" xmlns:appCommon="clr-namespace:Microsoft.EnterpriseManagement.ServiceManager.Application.Common;assembly=Microsoft.EnterpriseManagement.ServiceManager.Application.Common" xmlns:toolbox="clr-namespace:Microsoft.EnterpriseManagement.UI.WpfToolbox;assembly=Microsoft.EnterpriseManagement.UI.FormsInfra" xmlns:slaBinding="clr-namespace:Microsoft.EnterpriseManagement.ServiceManager.SLA.Common;assembly=Microsoft.EnterpriseManagement.ServiceManager.SLA.Common" xmlns:viewtools="clr-namespace:SomeLibrary.ViewTools;assembly=SomeLibrary.ViewTools">

            <mux:Column Name="Col1" DisplayMemberBinding="{Binding Path=Prop1, Mode=OneWay}" Width="100" DisplayName="Header_Prop1" Property="Porp1" DataType="s:String" />
            <mux:Column Name="Col2" DisplayMemberBinding="{Binding Path=Prop2, Mode=OneWay}" Width="200" DisplayName="Header_Prop2" Property="Prop2" DataType="s:String" />
            <mux:Column Name="Col3" DisplayMemberBinding="{Binding Path=Prop3, Mode=OneWay}" Width="200" DisplayName="Header_Prop3" Property="Prop3" DataType="s:String" />

            <mux:Column Name="Col4" DisplayMemberBinding="{Binding Path=Prop4, Mode=OneWay, Converter={x:Static viewtools:Converter1.Default}}" Width="160" DisplayName="Prop4" Property="Prop4" DataType="s:DateTime" />

            <mux:Column Name="Col5" Width="300" DisplayName="Prop5" Property="Prop4" DataType="s:String">
                <mux:Column.CellTemplate>
                    <DataTemplate>
                        <TextBlock Height="Auto" Width="Auto" TextWrapping="Wrap" >
                            <TextBlock.Text>
                                <MultiBinding Converter="{x:Static viewtools:Converter2.Default}">
                                    <MultiBinding.Bindings>
                                        <Binding Path="SomeObject1" />
                                        <Binding Path="SomeObject2" />
                                    </MultiBinding.Bindings>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
                </mux:Column.CellTemplate>
            </mux:Column>

            <mux:Column Name="COl6" Width="75" DisplayName="Prop6" Property="Prop6" DataType="s:String">
                <mux:Column.CellTemplate>
                    <DataTemplate>
                        <TextBlock Height="Auto" Width="100"  Text="{Binding Path=SomeObject3, Mode=OneWay, Converter={x:Static viewtools:Converter2.Default}}" Background="{Binding Path=SomeObject3, Converter={x:Static viewtools:Converter4.Default}}" TextAlignment="Center" VerticalAlignment="Center" Margin="0"   HorizontalAlignment="Center"/>
                    </DataTemplate>
                </mux:Column.CellTemplate>
            </mux:Column>

        </mux:ColumnCollection>
    </Columns>

</Presentation>

これは私が使用しているコードです:

XmlNodeList columnNodes = configXML.GetElementsByTagName("mux:ColumnCollection");

foreach (XmlNode col in columnNodes[0].ChildNodes.Cast<XmlNode>().Where(n=>n.NodeType != XmlNodeType.Comment))
{

    if (col.NodeType != XmlNodeType.Comment)
    {
        string converterName = string.Empty;
        string methodName = string.Empty;

        if (col.Attributes.GetNamedItem("DisplayMemberBinding").Value.Contains("Converter"))
        {
            string displayMemberBinding = col.Attributes.GetNamedItem("DisplayMemberBinding").Value;
            string converterInstanceName = displayMemberBinding.Substring(displayMemberBinding.LastIndexOf(":") + 1, displayMemberBinding.IndexOf("}") - displayMemberBinding.LastIndexOf(":"));

            converterName = converterInstanceName.Substring(0, converterName.IndexOf("."));
            methodName = converterInstanceName.Substring(converterName.IndexOf(".") + 1);

        }

        if (col.HasChildNodes)
        {
            converterName = col.LastChild.ChildNodes[0].LastChild.ChildNodes[0].FirstChild.Attributes.GetNamedItem("Converter").Value;
        }

    }
}

コードの問題は、多くの文字列操作を使用していることと、コンバーターが定義されている場所と接続されているプロパティに基づいて多くのカスタム条件が必要なことです。

この XML (XAML) ドキュメントを解析して操作し、コンバーター名とメソッド名、および変更するプロパティを取得するためのより良い (一般的な) 方法はありますか?

編集: XamlReader も使用してみて、PresentationCore dll への参照を追加しましたが、System.Windows.Markup 名前空間に XamlReader クラスが表示されません。

4

1 に答える 1

1

XPath を使用することがあなたの友達になるように思えます。

XPath を使用すると、必要なノードへのパスを条件付きで定義し、一致するノードのセットを返すことができます。

C# での使用例: http://support.microsoft.com/kb/308333

XPath チュートリアル: http://www.w3schools.com/xpath/

于 2013-05-01T15:33:58.887 に答える