让我先描述一下我的目标:我创建了一个具有3个属性的对象:开始,结束和时间。我创建了一个包含8个这些属性的ObservableCollection,所以它看起来像这样:
//C#
internal class MyObjects : ObservableCollection<MyObjectSetting>
{
public MyObjects()
: base()
{
Add(new MyObjectSetting(
start1,
end1,
time1);
Add(new MyObjectSetting(
start2,
end2,
time2);
(etc)
}
}
我想有3个ComboBox绑定到这8个对象中列出的各个属性,因此ComboBox看起来像“start1,start2,... start8”,“end1,end2,... end8”。
以下代码成功地将ComboBox绑定到对象本身,但是我对如何访问每个组合框的各个属性感到困惑。
// WPF
<Grid>
<Grid.Resources>
<local:MyObjects x:Key="myMyObjects"/>
</Grid.Resources>
<ComboBox x:Name="cbxStartPosition"
Grid.Row="0"
Grid.Column="3"
ItemsSource="{Binding Source={StaticResource myMyObjects}}"
>
</Grid>
有人可以帮我确定如何将集合中存储的对象的属性绑定到ComboBox中显示的显示值吗?
我已尝试为ListBox添加DataTemplate,以调查MSDN here上的MultiBinding示例,如下所示,但收到以下错误:
//WPF
<DataTemplate x:Key="StartPositionTemplate">
<ListBox>
<MultiBinding Converter="{StaticResource myNameConverter}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</ListBoxItem>
</DataTemplate>
错误32“DataTemplate”类型的值无法添加到“UIElementCollection”类型的集合或字典中。
由于我不在XAML部分内,因此触发了此错误。未来的HTH人。根据下面的答案,使用DataTemplate是可行的方法。
如果DataTemplate不是要走的路,有人知道什么是更好的方法吗?
答案 0 :(得分:2)
如果您只是想显示属性的字符串值,可以使用DisplayMemberPath
:
<ComboBox ItemsSource="{Binding Source={StaticResource myMyObjects}}" DisplayMemberPath="Start"/>
对于更复杂的方案,您可以使用自定义项目模板:
<ComboBox ItemsSource="{Binding Source={StaticResource myMyObjects}}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Start}"/>
<TextBlock Text="{Binding End}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>