3

我有一个包含多个子元素的 XML 文件。每个子元素都包含一系列元素,但 XML 模式没有记录,因此我无法解释所有可能的元素名称。我的目标是为每个子元素提供一个编辑器视图。例如:

XML 文件

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

我希望使用 WPF Toolkit 的 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 回答