【问题标题】:Selected item on WPF comboboxWPF 组合框上的选定项目
【发布时间】:2013-01-14 05:31:58
【问题描述】:

我有一些 wpf 组合框 (xaml):

<ComboBox ItemsSource="{Binding Path=NonPositionedConcentrators}"
          SelectedValue="{Binding Path=SelectedNonPositionedConcentrator}"
          DisplayMemberPath="SerialNumber" />

SelectedNonPositionedConcentrator - 是集中器类型。比如:

class Concentrator
{
...
public string SerialNumber {...}
...
public override ToString{ return "Some needed text..."; }
}

NonPositionedConcentrators - 集中器对象列表。

因此,在应用程序中,我看到带有 NonPositionedConcentrators 序列号的组合框(因为 DisplayMemberPath="SerialNumber"),但是当我选择某些东西时,选择的项目显示为 "Some needed text...",见图:

我已经尝试过 SelectedValuePath="SerialNumber",但它不起作用... 我不能删除这个 - public override ToString{ return "Some needed text..."; },因为我需要......

【问题讨论】:

  • 尝试使用带有 TextBlock 的 ItemTemplate:&lt;ComboBox.ItemTemplate&gt;&lt;DataTemplate&gt;&lt;TextBlock Text="{Binding Path=SerialNumber}"/&gt;&lt;/DataTemplate&gt;&lt;/ComboBox.ItemTemplate&gt;
  • 其实我试过了,但是情况一样...(((
  • public override ToString{ return "Some needed text..."; } 为什么需要这个?我们可能会提供更好的解决方案,因为我只会在我希望它像那样显示时覆盖它......

标签: wpf xaml combobox selecteditem selectedvalue


【解决方案1】:

您似乎有一个自定义的 ComboBox 模板,这可能会导致您的问题。如果它使用 TextBlock 或 ContentPresenter 来显示仅绑定 SelectedItem 属性而不拉入任何模板或其他设置的选定项目,那么无论如何您都只会获得 ToString 值。一个正确构建的模板将具有类似于默认模板在此位置使用的内容:

<ContentPresenter ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
    Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}"
    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

【讨论】:

    【解决方案2】:

    试试这个:

    <ComboBox ItemsSource="{Binding Path=NonPositionedConcentrators}"
          SelectedItem="{Binding Path=SelectedNonPositionedConcentrator}"
          DisplayMemberPath="SerialNumber" />
    

    编辑: 我已经复制了你的例子。我的集中器课:

    public class Concentrator
    {
        public string SerialNumber
        {
            get
            {
                return "123";
            }
        }
        public override string ToString()
        {
            return "Some needed text...";
        }
    }
    

    我的视图模型:

    public class TestViewModel : ViewModelBase
    {
        public ObservableCollection<Concentrator> NonPositionedConcentrators { get; set; }
        public Concentrator SelectedNonPositionedConcentrator { get; set; }
        public TestViewModel()
        {
            NonPositionedConcentrators = new ObservableCollection<Concentrator>();
            NonPositionedConcentrators.Add(new Concentrator());
            NonPositionedConcentrators.Add(new Concentrator());
            NonPositionedConcentrators.Add(new Concentrator());
        }
    }
    

    组合框:

        <ComboBox Height="23" Margin="25,12,103,0" Name="comboBox1" VerticalAlignment="Top" 
                  ItemsSource="{Binding Path=NonPositionedConcentrators}"
                  SelectedItem="{Binding Path=SelectedNonPositionedConcentrator}"
                  SelectedValuePath="SerialNumber"
                  DisplayMemberPath="SerialNumber" />
    

    它对我来说很好用!

    【讨论】:

      【解决方案3】:

      您可以包含一个项目模板:

             <ComboBox.ItemTemplate>
                  <DataTemplate>
                      //your stuff
                  </DataTemplate>
              </ComboBox.ItemTemplate>
      

      【讨论】:

      • 你是否删除了显示成员路径并将选定值更改为选定项?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多