2016-07-13 3 views
0

Я новичок в WPF. У меня есть StackPanel, который содержит несколько comboboxes с ItemSource (установленный в стиле StackPanel) из представления (CaSupplierColumns) в SQL Server (Visual Studio автоматически создала ссылку, которую я перетащил ordersDataSet с панели источника данных). Нет проблем с этим.Несколько DisplayMemberPaths в CompositeCollection?

Проблема возникает, когда я использую CompositeCollection, чтобы добавить пользовательское значение в одно из списков (Manufacturer), все значения отображаются правильно, а добавленный элемент тоже отображается - но пустой. Добавленный элемент отображается как пустой параметр в поле со списком.

Виновника я обнаружил это DisplayMemberPath набора для Columns (который является именем заголовка столбца в представлении базы данных), когда я установил DisplayMemberPath обнулить для этого выпадающего списка, добавленный элемент появляется действительно правильно, но другие значения в поле со списком отображается как System.Data.DataRowView.

Как я могу использовать два разных DisplayMemberPath s в одном CompositeCollection? Или, может быть, есть другой способ сделать это?

Вот мой текущий XAML (раздели, чтобы оставить ключевые части):

<Window.Resources> 
    <local:OrdersDataSet x:Key="ordersDataSet" /> 
    <CollectionViewSource x:Key="caSupplierColumnsViewSource" Source="{Binding CaSupplierColumns, Source={StaticResource ordersDataSet}}" /> 
</Window.Resources> 
    <StackPanel Name="MapFields" DataContext="{StaticResource caSupplierColumnsViewSource}"> 
     <StackPanel.Resources> 
      <Style TargetType="ComboBox"> 
       <Setter Property="ItemsSource" Value="{Binding}" /> 
       <Setter Property="DisplayMemberPath" Value="Columns" /> 
       <Setter Property="SelectedValuePath" Value="Columns" /> 
       <Setter Property="IsSynchronizedWithCurrentItem" Value="False" /> 
      </Style> 
     </StackPanel.Resources> 
     ... 

     <ComboBox Name="MfrPartNo" /> 
     ... 

     <ComboBox Name="Manufacturer"> 
      <ComboBox.ItemsSource> 
       <CompositeCollection> 
        <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=caSupplierColumnsViewSource}}" /> 
        <ListBoxItem>Another option</ListBoxItem> 
       </CompositeCollection> 
      </ComboBox.ItemsSource> 
     </ComboBox> 
    </StackPanel> 
+0

Вы хотите показать фиксированный текст как «Пожалуйста, выберите ...» перед списком предметов? – AnjumSKhan

ответ

2

Я хотел бы создать неявные DataTemplates для различных типов в коллекции, и я положил их в том же StackPanel.Resources где вы» ve получил неявный стиль ComboBox. Вам нужно будет избавиться от атрибута DisplayMemberPath, потому что это предотвратит применение неявных DataTemplates.

DisplayMemberPath не очень мощная функция; вы переключаетесь на DataTemplates, когда происходит странное. Выбрасывание разнородной группы вещей в ComboBox - одна из интересных вещей, которые вы можете сделать с WPF, но вам все равно придется сделать какую-то работу, чтобы извлечь из нее много пользы.

SelectedValuePath также будет ограниченным использованием, по понятным причинам. Возможно, вам придется начать привязывать SelectedItem к свойству viewmodel типа Object и делать некоторые попытки играть в сеттер там.

<StackPanel.Resources> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding}" /> 
      <Setter Property="SelectedValuePath" Value="Columns" /> 
      <Setter Property="IsSynchronizedWithCurrentItem" Value="False" /> 
     </Style> 

     <DataTemplate DataType="{x:Type Manufacturer}"> 
      <!-- I'm assuming Manufacturer has a Name property; change as needed --> 
      <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 

     <DataTemplate 
      xmlns:sysdata="clr-namespace:System.Data;assembly=System.Data" 
      DataType="{x:Type sysdata:DataRowView}"> 
      <TextBlock Text="{Binding Columns}" /> 
     </DataTemplate> 

     <!-- Etc. --> 

    </StackPanel.Resources>