2

ユーザー入力用の UI 要素を作成する方法を説明する XML ドキュメントと、いくつかのデータと XPath 式を含むデータ オブジェクトがあります。HierarchicalDataTemplate を使用して XML に基づいて UI を構築するデータ オブジェクト タイプの DataTemplate がありますが、XML のサブセットのみを使用したいと考えています。XPath 式が静的であれば、次のように書くことができます。

<TreeView ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath=/Static/XPath/Expression/*}" />

XPath 式はデータ オブジェクトから取得されるため、データ バインディングを使用すると便利です。

<TreeView ItemsSource="{Binding Source={StaticResource dataProvider},
    XPath={Binding Path=Data.XPathExpression}}" />

残念ながら、Binding MarkupExtension は DependencyObject から継承しないため、そのプロパティは DependencyProperty ではなく、データ バインディングをサポートしていません。

XML データにバインドするときに動的 XPath 式を適用するにはどうすればよいですか?

4

1 に答える 1

0

XML データと XPath 式を新しい XML データに変換する IMultiValueConverter を作成できます。

public object Convert(object[] values, Type targetType, object parameter,
    CultureInfo culture)
{
    try
    {
        if (values.Length < 2) { return null; }

        var data = values[0] as IEnumerable;
        if (data == null) { return null; }

        var xPathExpression = values[1] as string;
        if (xPathExpression == null) { return null; }

        XmlDocument xmlDocument = data.Cast<XmlNode>()
            .Where(node => node.OwnerDocument != null)
            .Select(node => node.OwnerDocument)
            .FirstOrDefault();

        return (xmlDocument == null) ? null : 
            xmlDocument.SelectNodes(xPathExpression);
    }
    catch (Exception) { return null; }
}

public object[] ConvertBack(object value, Type[] targetTypes,
    object parameter, System.Globalization.CultureInfo culture)
{
    throw new NotImplementedException();
}

次に、MultiBinding を使用して、ItemsSource を XML データにバインドし、動的な XPathExpression をコンバーターでバインドします。

<TreeView>
    <TreeView.Resources>
        <this:XmlXPathConverter x:Key="xmlXPathConverter" />
    </TreeView.Resources>
    <TreeView.ItemsSource>
        <MultiBinding Converter="{StaticResource xmlXPathConverter}">
            <Binding Source="{StaticResource dataProvider}" />
            <Binding Path="Data.XPathExpression" />
        </MultiBinding>
    </TreeView.ItemsSource>
</TreeView>
于 2012-10-23T20:26:37.783 に答える