GridView中的组合框是同步的,而不是绑定到数据库中的值

时间:2010-07-03 01:21:19

标签: vb.net entity-framework combobox binding

我尝试在gridview中设置组合框,但所有组合框都包含相同的值,而不是数据库中的值。我正在使用实体框架和WPF。两个表之间存在父子关系,但组合框的源是一个单独的表,其中包含标记的名称和ID。我一直在寻找。希望这不会太容易解决。

“标记”列显示组合框。列“标签ID”显示数据库中的值。当我显示数据时,TagID会在不同的行中发生变化,但Tag列在所有行中都是相同的(第一个选择)。当我改变一个组合框时,它们都会改变。我看不出他们在哪里联系在一起。您可以提供的任何帮助将不胜感激。 (澎马?)

这是XAML

<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="372" Width="675" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:my="clr-namespace:TagFinanceWPF">
<Window.Resources>
    <CollectionViewSource x:Key="TransactionsViewSource" d:DesignSource="{d:DesignInstance my:Transaction, CreateList=True}" />
    <CollectionViewSource x:Key="TransactionsTransactionTagsViewSource" Source="{Binding Path=TransactionTags, Source={StaticResource TransactionsViewSource}}" />
    <CollectionViewSource x:Key="TagLookup" />
</Window.Resources>
<Grid DataContext="{StaticResource TransactionsViewSource}">
    <ListView ItemsSource="{Binding Source={StaticResource TransactionsTransactionTagsViewSource}}" Margin="12" Name="TransactionTagsListView" SelectionMode="Single">
        <ListView.ItemContainerStyle>
            <Style>
                <Setter Property="Control.HorizontalContentAlignment" Value="Stretch" />
                <Setter Property="Control.VerticalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn x:Name="TransactionIDColumn1" Header="Transaction ID" Width="80">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=TransactionID}" Margin="6,-1,-6,-1" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn x:Name="TagIDColumn" Header="Tag" Width="80">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox Margin="-6,-1" 
                                      ItemsSource="{Binding Source={StaticResource TagLookup}}" 
                                      DisplayMemberPath="TagName" 
                                      SelectedValuePath="TagID"
                                      SelectedValue="{Binding TagID}" 
                                      IsReadOnly="True">
                            </ComboBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn x:Name="TagIDColumn2" Header="Tag ID" Width="80">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <Label Content="{Binding Path=TagID}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

VB代码是:

Class MainWindow

Dim BentleyvideoEntities As TagFinanceWPF.bentleyvideoEntities = New TagFinanceWPF.bentleyvideoEntities()

Private Function GetTransactionsQuery(ByVal BentleyvideoEntities As TagFinanceWPF.bentleyvideoEntities) As System.Data.Objects.ObjectQuery(Of TagFinanceWPF.Transaction)

    Dim TransactionsQuery As System.Data.Objects.ObjectQuery(Of TagFinanceWPF.Transaction) = BentleyvideoEntities.Transactions
    'Update the query to include TransactionTags data in Transactions. You can modify this code as needed.
    TransactionsQuery = TransactionsQuery.Include("TransactionTags")
    'Returns an ObjectQuery.
    Return TransactionsQuery
End Function

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded

    'Load data into Transactions. You can modify this code as needed.
    Dim TransactionsViewSource As System.Windows.Data.CollectionViewSource = CType(Me.FindResource("TransactionsViewSource"), System.Windows.Data.CollectionViewSource)
    Dim TransactionsQuery As System.Data.Objects.ObjectQuery(Of TagFinanceWPF.Transaction) = Me.GetTransactionsQuery(BentleyvideoEntities)
    TransactionsViewSource.Source = TransactionsQuery.Execute(System.Data.Objects.MergeOption.AppendOnly)
    'Load data into Tags. You can modify this code as needed.


    Dim customerList = From c In BentleyvideoEntities.Tags _
                                  Order By c.TagName

    Dim custSource = CType(Me.FindResource("TagLookup"), CollectionViewSource)
    custSource.Source = customerList.ToList()

End Sub

结束班

1 个答案:

答案 0 :(得分:1)

我在研究您的问题时找到this,听起来就像您遇到的完全相同的问题。

链接中的Snippit:

  

我不确定这是否会有所帮助,但我   在Chris Sells的Windows中阅读   表格绑定在C#,脚注,页面   482',数据源绑定   每个组合框由一个管理   反过来常见的绑定管理器   是绑定上下文的一部分。该   绑定amager保留所有组合框   同步到同一行   数据库。但是,如果每个组合框   因此,具有不同的Binding上下文   一个不同的绑定管理器,然后是   组合框可以显示不同的行   来自相同的数据源。

基于this second文章(和建议的解决方案),您需要使用行数据绑定事件来设置组合框的绑定,以便为每个行绑定创建一个新的绑定管理器实例。