Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个表的Wpf DataGridComboxColumn绑定?_C#_.net_Wpf_Datagrid_Wpfdatagrid - Fatal编程技术网

C# 两个表的Wpf DataGridComboxColumn绑定?

C# 两个表的Wpf DataGridComboxColumn绑定?,c#,.net,wpf,datagrid,wpfdatagrid,C#,.net,Wpf,Datagrid,Wpfdatagrid,我必须为书籍和出版社上课: 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 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>
我想要的是,将PhidComboxColumn的默认值设置为取自一本书,但当我想要编辑它时,我想查看所有可用出版社的phId列表。我必须为两个数据源绑定“DataGridComboxColumn”吗?

您的Book类应该有一个属性,包含所有可用发布库的phId列表,如下所示:

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

如果我这样做的话,每本书的每一个对象都将包含相同的可用出版社的收藏。从记忆上看,这是非常不充分的。还有其他解决办法吗

为了防止数据冗余,如果您使用mvvm并获得如下组合框数据,则可以在父类(例如图书列表容器视图模型)中定义PhIdList:

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

假设在您的组合框中有一个出版社的phId列表,您选择例如phId3,如果必须从一本书中获取默认值,那么您希望选择哪本书?如果我这样做,我希望书的phId值将更改为phId3,每本书的每一个对象都将包含相同的可用出版社的收藏。从记忆上看,这是非常不充分的。还有其他解决办法吗?