【问题标题】:Wpf DatagridComboBoxColumn binding for two tables?两个表的Wpf DatagridComboBoxColumn绑定?
【发布时间】:2015-05-31 09:39:06
【问题描述】:

我必须去书籍和出版社上课:

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 列表987654325@。我必须以某种方式为两个数据源绑定“DataGridComboBoxColumn”吗?

【问题讨论】:

  • 假设在您的Combobox 中有一个出版社的 phId 列表,并且您选择例如 phId#3,如果必须从书中获取默认值,那么您希望使用哪个 Book被选中?
  • 我希望 Book 的 phID 值将更改为 phId#3

标签: c# .net wpf datagrid wpfdatagrid


【解决方案1】:

您的Book 类应该有一个Property,其中包含所有可用PublishingHousesphId's 列表,如下所示:

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>

编辑

如果这样做,Book 的每个对象都将包含相同的可用 PublishingHouse 集合。这对记忆来说是非常低效的。有其他解决办法吗?

为了防止数据冗余,您可以在 父类 中定义 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>

【讨论】:

  • 如果我这样做,Book 的每个对象都将包含相同的可用PublishingHouses 集合。这对记忆来说是非常低效的。还有其他解决方案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2011-07-27
  • 2017-08-05
  • 2018-01-22
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多