【问题标题】:Bind WPF Extended Toolkit PropertyGrid to a dictionary or other dynamic source?将 WPF 扩展工具包 PropertyGrid 绑定到字典或其他动态源?
【发布时间】:2012-08-31 10:47:54
【问题描述】:

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

XML 文件

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

我希望使用 WPF Toolkit 的 PropertyGrid 控件(或类似的控件)来显示&lt;element&gt; 的所有子元素的列表,但该控件旨在绑定到 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。有没有更好的方法来处理我正在尝试做的事情?有更好的控制吗?

【问题讨论】:

    标签: wpf dynamicobject


    【解决方案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 中找到用户更改的任何值,因此保存该值应该会保留用户的更改。

    【讨论】:

    • 这很好用,除了文本框不可编辑。有什么想法吗?
    【解决方案2】:

    看看this,它应该基本上解释了一切。简而言之,实现 ICustomTypeDescriptor(在派生自 ExpandoObject 的类型上)应该可以正常工作;我查看了 Extended WPF Toolkit 源代码,我认为它会正确处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 2011-08-26
      • 2012-03-08
      • 1970-01-01
      • 2012-11-16
      相关资源
      最近更新 更多