将下拉框显示文本设置为ObservableCollection<T>的属性

4
我有一个集合,我想将其绑定到一个下拉框中:
public ObservableCollection<Parameter> Values
{ get; set; }

public class Parameter
{
    public String Text { get; set; }
    public String Value { get; set; }
}

我需要将下拉框的显示文本绑定到 Parameter 类的 Text 属性上,我已经尝试了以下几种方式,但都没有成功:
<ComboBox ItemsSource="{Binding Values}" DisplayMemberPath="Parameter.Text"
<ComboBox ItemsSource="{Binding Values}" DisplayMemberPath="Parameter\Text"
<ComboBox ItemsSource="{Binding Values}" DisplayMemberPath="Text"

当我尝试上述三种方法时,[程序集名称].Parameter会在每个参数的组合框中显示。
前两种方法在组合框中不显示任何内容。
<ComboBox ItemsSource="{Binding Values, Path=Text}"
<ComboBox ItemsSource="{Binding Values, Path=Values.Text}"

这个函数会将第一个参数中的文本拆分成单个字符,并将每个字符作为 独立的 项目显示在组合框中:

<ComboBox ItemsSource="{Binding Values, Path=Values/Text}"

enter image description here

更新:

以下是完整的XAML代码:

<ListBox BorderBrush="{x:Null}" Grid.Column="0" Height="100" Grid.ColumnSpan="2" Grid.Row="1" ItemsSource="{Binding ItemParams}" ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="2" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock TextTrimming="CharacterEllipsis" Grid.Column="0" Margin="2" Text="{Binding Name}" Background="{Binding ElementName=cmbColors, Path=SelectedItem}"/>
                <ComboBox ItemsSource="{Binding Values}" DisplayMemberPath="Text" SelectedIndex="0" HorizontalAlignment="Left" Grid.Column="1" Margin="2" Width="150" Name="cmbColors" >
                    <ComboBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Grid.Column="1" Margin="2, 1" Text="{Binding}"/>
                        </DataTemplate>
                    </ComboBox.ItemTemplate>
                </ComboBox>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

参数类:

public class Params
{
    public Params(String name, ObservableCollection<Parameter> values)
    {
        Name = name;
        Values = values;
    }

    public String Name
    { get; set; }

    public ObservableCollection<Parameter> Values
    { get; set; }
}
3个回答

6
正确的表述方式就是您已经提到的其中之一:

<ComboBox ItemsSource="{Binding Values}" DisplayMemberPath="Text"

请再检查一遍,如果还不行,请发布您原封不动的XAML。


我已经发布了完整的XAML,希望这有助于确定问题所在。目前你提出的解决方案不起作用。 - Denys Wessels
@Deni:你发的不是我建议的代码 :) 请花点时间编辑、测试,如果不行再发布修改后的代码。 - Jon
我已更新问题并再次测试了代码。如果我再次在组合框中重复显示 [assembly name].Parameter,则需要再次检查。 - Denys Wessels
@Deni:{Binding ItemParams}ListBox 上会解析成什么?这就是绑定引擎期待找到 Values 的地方。 - Jon

4
你可以直接进行操作:
<ComboBox ItemsSource="{Binding Values}" DisplayMemberPath="Text" />

对于WPF中的ComboBox,每个元素(ComboBoxItem)都是类型为T的,因此它将在T上查找公共属性,这就是为什么只需使用Text即可。


0

只需删除组合框项模板或设置Text = "{Binding Text}"

   <ComboBox.ItemTemplate> 
        <DataTemplate> 
            <TextBlock Grid.Column="1" Margin="2, 1" Text="{Binding}"/> 
        </DataTemplate> 
    </ComboBox.ItemTemplate> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接