3

複数の子要素を含む XML ファイルがあります。各子要素には一連の要素が含まれていますが、XML スキーマは文書化されていないため、考えられるすべての要素名を説明することはできません。私の目標は、子要素ごとにエディター ビューを提供することです。例えば:

XML ファイル

<root>
    <element>
        <subelement1>value</subelement>
        <randomName88787>value</randomName>
        <somethingTotallyFunky>value</somethingTotallyFunky>
        <iHaveNoIdeaWhatThisWillBe>value</iHaveNoIdeaWhatThisWillBe>
    </element>
</root>

WPF ツールキットの PropertyGrid コントロール (または同様のもの) を使用して、のすべての子要素のリストを表示したいと考えて<element>いましたが、このコントロールは CLR オブジェクトにバインドされるように設計されています。もちろん、プロパティがどうなるかわからないので、プロパティを持つクラスを定義することはできません。expando オブジェクトにバインドするために次のコードを試しました。

var expando = new ExpandoObject();
var dict = (IDictionary<string, object>)expando;
foreach (var prop in unit.Elements())
{
    if (dict.ContainsKey(prop.Name.LocalName) == false)
    {
        dict.Add(prop.Name.LocalName, (string)prop.Value);
    }
}

Properties.SelectedObject = expando;

しかし、プロパティは表示されません。ExpandoObject をうまく処理していないようです。私がやろうとしていることにアプローチするより良い方法はありますか? それを行うためのより良いコントロールはありますか?

4

2 に答える 2

1

これを見てください、それは基本的にすべてを説明するはずです。つまり、ICustomTypeDescriptor(ExpandoObjectから派生した型)の実装は正常に機能するはずです。拡張WPFツールキットのソースコードを調べたところ、適切に処理されると思います。

于 2012-09-02T22:53:36.803 に答える
1

実際には、カスタム オブジェクトを使用せずにこれを行うことができます。data.xml という名前のファイル内のサンプル データを使用して、次の XAML を試してください。

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <XmlDataProvider x:Key="data" Source="data.xml" XPath="/root/element/*"/>
</Window.Resources>
<Grid>
    <ListView ItemsSource="{Binding Source={StaticResource data}}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Tag" Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=Name}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Value" Width="100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text="{Binding Path=InnerText}"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>
</Window>

XmlDataProvider.Document でユーザーが変更した値が見つかると思いますので、それを保存するとユーザーの変更が保持されます。

于 2012-09-03T20:19:51.460 に答える