Combobox в GridView синхронизируются вместо привязки к значению из базы данных - PullRequest
0 голосов
/ 03 июля 2010

Я попытался настроить поля со списком в виде сетки, но все поля со списками имеют одно и то же значение вместо значения из базы данных.Я использую Entity Framework и WPF.Между двумя таблицами есть родительские дочерние отношения, но источником поля со списком является отдельная таблица с именами и идентификаторами для тегов.Я искал весь день.Надеюсь, это не будет легко решить.

В столбце «Тег» отображается поле со списком.Столбец «Tag ID» отображает значение из базы данных.Когда я отображаю данные, TagID изменяется в разных строках, но столбец Tag одинаков (первый выбор) во всех строках.Когда я меняю одно поле со списком, все они меняются.Я не могу видеть, где они связаны друг с другом.Мы будем благодарны за любую помощь, которую вы можете оказать.(Buler?)

Вот 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 Ответ

1 голос
/ 28 июля 2010

Я обнаружил это во время исследования вашей проблемы, и похоже, что это та же самая проблема, с которой вы столкнулись.

Фрагмент ссылки:

ЯЯ не уверен, поможет ли это, но я читал в книге Криса Селлса «Связывание форм Windows в C #, сноска, стр. 482», что источник данных связан с каждым списком и управляется общим диспетчером связывания, который, в свою очередь, является частьюобязательный контекст.Средство связывания поддерживает синхронизацию всех комбинированных списков с одной строкой в ​​базе данных.Однако, если каждый выпадающий список имеет свой контекст привязки, а значит, и другой диспетчер привязки, в комбинированных полях могут отображаться разные строки из одного и того же источника данных.

На основе в эту секунду В статье (и предлагаемом решении) вам нужно использовать событие привязки данных строки, чтобы настроить привязку комбинированного списка, чтобы для каждого связывания строки создавалось новое хранилище менеджера привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...