Выбранный элемент в поле со списком WPF

У меня есть выпадающий список 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..."; }, потому что мне нужно ...


person Witcher    schedule 30.01.2013    source источник
comment
Попробуйте использовать ItemTemplate с TextBlock: <ComboBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding Path=SerialNumber}"/></DataTemplate></ComboBox.ItemTemplate>   -  person Florian Gl    schedule 30.01.2013
comment
Собственно пробовал, но ситуация та же ... (((   -  person Witcher    schedule 30.01.2013
comment
public override ToString{ return "Some needed text..."; } зачем тебе это? Мы можем предложить лучшие решения, так как я отменю его только в том случае, если я хочу, чтобы он отображался таким образом ...   -  person Bolu    schedule 30.01.2013


Ответы (3)


Похоже, у вас есть собственный шаблон 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}"/>
person John Bowen    schedule 30.01.2013

Попробуй это:

<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" />

У меня он отлично работает!

person Andrey Gordeev    schedule 30.01.2013

Вы можете включить шаблон элемента:

       <ComboBox.ItemTemplate>
            <DataTemplate>
                //your stuff
            </DataTemplate>
        </ComboBox.ItemTemplate>
person JMan    schedule 30.01.2013
comment
вы удалили путь к отображаемому члену и изменили выбранное значение на выбранный элемент? - person JMan; 30.01.2013