问题描述
我使用 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
定义是一个类而不是一个类实例。它给了我 CityModel
或 PersonModel
的选项,但不是 cities
集合,我认为我应该根据 How-to 在这里指定。
如果 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 (将#修改为@)