2013-08-17 2 views
0

У меня есть этот код:ComboBox ItemsSource и по умолчанию выбрано значение не работает

<ComboBox Name="cbxWorkers" HorizontalContentAlignment="Right" 
      ItemsSource="{Binding Workers}"> 
    <ComboBoxItem IsSelected="True" Content="Select" /> 
     <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <ComboBoxItem Content="{Binding LastName}" /> 
     </DataTemplate> 
     </ComboBox.ItemTemplate> 
</ComboBox> 

Все отлично работает, за исключением второй линии. Это дает мне исключение во время выполнения: Элемент коллекции должен быть пуст перед использованием ItemsSource.

Как я могу справиться с этим, поэтому я получу также всех Рабочих, а также элемент - «Выбрать» в качестве первого элемента списка со списком?

спасибо :)

+0

См. Http://stackoverflow.com/q/1426050/620360. – LPL

+0

Что вы подразумеваете под "" Выбрать "в качестве первого элемента?" – Paparazzi

+1

Вы либо должны иметь ItemsSource = "{Binding Workers}", либо явно помещать элементы в combobox в определение xaml. Никогда! –

ответ

0

Вы не можете иметь два источника. Вам нужно указать в коде из ItemsSource, который вы хотите выбрать.

<ComboBox Name="cbxWorkers" HorizontalContentAlignment="Right" ItemsSource="{Binding Workers}"> 
<ComboBox.ItemTemplate> 
    <DataTemplate> 
     <ComboBoxItem Content="{Binding LastName}" IsSelected="{Binding isSelected}" /> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

Вы можете сделать это, или вы можете просто сделать дополнительный первый элемент в C#/VB и убедитесь, что он выбран.

0

Вы можете сделать это с помощью CompositeCollection:

<ComboBox x:Name="cbxWorkers" SelectedIndex="0"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=LastName}" /> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <ComboBoxItem Content="Select" /> 
      <CollectionContainer Collection="{Binding Workers}" /> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

Примечание: Вы должны установить SelectedIndex="0" на ComboBox, потому что, когда ComboBoxItem находится в ItemsSource, его свойство IsSelected не установит выбор на ComboBox.

Редактировать относительно CollectionContainer

As @ H.B. указал, что Binding на CollectionContainer не будет работать таким образом. У вас есть несколько вариантов. Они изложены для вас этой статьей CodeProject, поэтому я не буду повторять их здесь. Один из методов, который не упоминается, - это новый вариант (как .NET 4) x:Reference. Он будет использоваться следующим образом:

<CollectionContainer Collection="{Binding DataContext.Workers, Source={x:Reference cbxWorkers}}" /> 
+0

Почему бы не выбрать? Ведь «DataTemplate» будет проигнорирован. Также обычно [эти привязки не будут работать] (http://stackoverflow.com/q/6446699/546730). –

+0

Я понятия не имею, но это не было в Kaxaml, но отлично работал при настройке 'SelectedIndex'. Вероятно, он имеет какое-то отношение к таймингу (сделаю ставку, установив его после загрузки представления). Однако я собираюсь обновить ответ о втором вопросе, поскольку вы определенно правы в этом. –

+0

@ H.B. Кроме того, я понятия не имел, что x: ссылка работала в WPF сейчас. Я только предположил, что документация для него будет актуальной и никогда не пробовала. Это позволит мне удалить код. Так грустно, что это делает меня счастливым ... –

Смежные вопросы