将Collection的属性的显示值绑定到ComboBox

时间:2009-10-30 18:34:51

标签: c# .net wpf data-binding

让我先描述一下我的目标:我创建了一个具有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不是要走的路,有人知道什么是更好的方法吗?

1 个答案:

答案 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>