WPF Xceed PropertyGrid ComboBox 绑定 - 如何填充来自另一个类的项目列表?

问题描述

我使用 Xceed PropertyGrid显示各种对象的属性。在大多数情况下,这很简单。我只是将 Selectedobject 属性设置为适当的对象。

但是,我有一种情况,其中一个对象属性是对来自不同类的集合的另一个对象的引用。我在此处创建了一个简化示例,用于演示和测试目的。在此示例中,Person 对象具有 City 属性,它是 CityModel 类的实例。因此,对于任何给定的 Person用户应该能够从 cities 集合中选择他们的居住城市。人物和城市的集合是——或者至少在真实的事物中——是动态的和用户可变的。

我可以使用 ComboBox 填充 EditorTemplate,但在引用 cities 集合时遇到问题。

如果尝试将 Source 定义为 StaticResource,我不会得到预期的行为。 This How-to from Microsoft 显示 ObservableCollection (People) 被定义为 Resource,随后在数据绑定中被引用为 StaticResource。当我尝试做同样的事情时,Visual Studio 显然希望 Resource 定义是一个类而不是一个类实例。它给了我 CityModelPersonModel 的选项,但不是 cities 集合,我认为我应该根据 How-to 在这里指定。

Intellisense showing available options for data source definition

如果 Source 不指向集合,我不确定如何以及在绑定中指定它的位置,因为(同样基于智能感知)它不能进入​​ Path。>

在不使用 StaticResource 的情况下,我可以执行以下任一操作,这两种操作都会导致一个空白列表:

ItemsSource="{Binding Source=DataContext.cities,Path=Name}"

ItemsSource="{Binding Source=cities,Path=Name}"

或者这样,导致文本字符串“cities”被用作源:

ItemsSource="{Binding Source=cities}"

在下面的代码中,我可以通过复制 cities 类中的 Person 集合来获得所需的结果,该集合将其公开给 ComboBox 而无需指定 {{1 }},但这在很大程度上是一种解决方法

Source

<Grid>
    <StackPanel Orientation="Vertical">
        <TextBlock Padding="0,10,5">People:</TextBlock>
        <ListBox Name="listPeople" ItemsSource="{Binding people}" displayMemberPath="FirstName" SelectionChanged="listBox_SelectionChanged" />
        <TextBlock Padding="0,5">Cities:</TextBlock>
        <ListBox Name="listCities" ItemsSource="{Binding cities}" displayMemberPath="Name" SelectionChanged="listBox_SelectionChanged" />
        <TextBlock Padding="0,5">Properties:</TextBlock>
        <xctk:PropertyGrid x:Name="MyPropertyGrid">
            <xctk:PropertyGrid.EditorDeFinitions>
                <xctk:EditorTemplateDeFinition TargetProperties="City">
                    <xctk:EditorTemplateDeFinition.EditingTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding Instance.citiesList}" SelectedValue="{Binding Instance.City}" />
                        </DataTemplate>
                    </xctk:EditorTemplateDeFinition.EditingTemplate>
                </xctk:EditorTemplateDeFinition>
            </xctk:PropertyGrid.EditorDeFinitions>
        </xctk:PropertyGrid>
    </StackPanel>
</Grid>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)