2015-05-31 4 views
2

я должен классов книг и издательств:Wpf DatagridComboBoxColumn привязка для двух таблиц?

public partial class Books 
{ 
    public Books() 
    { 
     this.Authors = new ObservableCollection<Authors>(); 
    } 

    public int bID { get; set; } 
    public string Title { get; set; } 
    public int phID { get; set; } 
    public Nullable<short> PubYear { get; set; } 
    public Nullable<short> Edition { get; set; } 

    public virtual PublishingHouse PublishingHouse { get; set; } 
    public virtual ObservableCollection<Authors> Authors { get; set; } 
} 
public partial class PublishingHouse 
{ 
    public PublishingHouse() 
    { 
     this.Books = new ObservableCollection<Books>(); 
    } 

    public int phID { get; set; } 
    public string Title { get; set; } 
    public string City { get; set; }  

    public virtual ObservableCollection<Books> Books { get; set; } 
} 

Так у меня есть DataGrid, который показывает мне все мои книги:

<Window.Resources> 
    <CollectionViewSource x:Key="booksViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Books}, CreateList=True}"/> 
    <CollectionViewSource x:Key="booksAuthorsViewSource" Source="{Binding Authors, Source={StaticResource booksViewSource}}"/> 
    <CollectionViewSource x:Key="authorsViewSource" d:DesignSource="{d:DesignInstance {x:Type local:Authors}, CreateList=True}"/> 
    <CollectionViewSource x:Key="publishingHouseViewSource" d:DesignSource="{d:DesignInstance {x:Type local:PublishingHouse}, CreateList=True}"/> 
</Window.Resources> 
<Grid DataContext="{StaticResource booksViewSource}" Margin="0,0,2,0"> 
    <DataGrid ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="b ID" Binding="{Binding bID}"/> 
      <DataGridTextColumn Header="Title" Binding="{Binding Title}"/> 
      <DataGridTextColumn Header="#" Binding="{Binding Edition}"/> 
      <DataGridTextColumn Header="Year" Binding="{Binding PubYear}"/> 
      <DataGridComboBoxColumn x:Name="phIDComboBoxColumn" SelectedItemBinding="{Binding phID}" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Дело я хочу, чтобы установить значение по умолчанию моего phIDComboBoxColumn взято из книги, но когда я хочу ее отредактировать, я хочу просмотреть список phId всех доступных PublishingHouses. Должен ли я каким-то образом привязать «DataGridComboBoxColumn» к двум данным?

+0

Предположим, есть список phId's PublishingHouses в вашем «Combobox», и вы выбираете, например, phId # 3, если значение по умолчанию должно быть взято из книги, а какую «Книгу» вы ожидаете выбрать? –

+0

Я ожидаю, что значение phID книги будет изменено на phid # 3 – Sic

ответ

1

Ваш Book класс должен иметь Property, содержащий список phId's всех Имеющийся PublishingHouses как это:

public ObservableCollection<int> PhIdList {get; set;} 

тогда ваши DataGridComboBoxColumn изменения, как это:

<DataGridComboBoxColumn Header="PhIDs" SelectedItemBinding="{Binding phID}"> 
    <DataGridComboBoxColumn.ElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding PhIdList}"/> 
      <Setter Property="IsReadOnly" Value="True"/> 
     </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
    <DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox"> 
      <Setter Property="ItemsSource" Value="{Binding PhIdList}"/> 
     </Style> 
    </DataGridComboBoxColumn.EditingElementStyle> 
</DataGridComboBoxColumn> 

EDIT

Если я сделаю так, каждый объект Книги будет содержать идентичные коллекции доступных издательств. Это очень неэффективно по памяти. Это другое решение?

Для предотвращения избыточности данных можно определить PhIdList в родительского класса (например, книга-список контейнеров вид-модель, если вы используете MVVM) и получить ComboBox данные, как это:

  <DataGridComboBoxColumn 
       SelectedItemBinding="{Binding phID}" DisplayMemberPath="" > 
       <DataGridComboBoxColumn.ElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" Value="{Binding Path=DataContext.BooksContainerVM.PhIdList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
        </Style> 
       </DataGridComboBoxColumn.ElementStyle> 
       <DataGridComboBoxColumn.EditingElementStyle> 
        <Style TargetType="{x:Type ComboBox}"> 
         <Setter Property="ItemsSource" Value="{Binding Path=DataContext.BooksContainerVM.PhIdList, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" /> 
        </Style> 
       </DataGridComboBoxColumn.EditingElementStyle> 
      </DataGridComboBoxColumn> 
+0

Если я сделаю так, каждый объект 'Book' будет содержать идентичные коллекции доступных« PublishingHouses ». Это очень неэффективно по памяти. Это другое решение? – Sic

+0

Это правда, см. Мое редактирование. –

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