WPF 4.0 AutoCompleteBox Двухсторонняя привязка - PullRequest
1 голос
/ 18 мая 2011

У меня есть окно WPF с несколькими элементами управления Listbox и DataGrid.В главном окне списка отображается список подрядчиков.Сетка данных Address (s) привязана к ListBox Подрядчика и отображает адреса для текущего выбранного Подрядчика.

Я хочу, чтобы пользователи этого окна (WPF) могли добавлять адреса выбранному подрядчику, используя встроенную функциональность добавления данных.Я также хочу, чтобы пользователи могли редактировать связанные записи адресов, щелкнув ячейку таблицы данных и имея функцию ячейки в качестве AutoCompleteBox.

Я частично успешно реализовал AutoCompleteBox в столбце «Состояние» элемента управления сеткой данных.В настоящее время правильное значение Text для текущего Исполнителя отображается в столбце State таблицы данных Address.Если я редактирую ячейку State, я получаю ожидаемую функцию автозаполнения и могу выбрать новое State.

Что не работает, так это привязка TwoWay.В настоящее время, если я изменяю текущее состояние адреса, оно не сохраняется обратно в модель сущности или в базу данных.Это неудивительно, поскольку я знаю, что привязка Twoway не реализована правильно в этом элементе управления.

Я успешно реализовал привязку Twoway с помощью комбинированного списка, но этот комбинированный список, очевидно, не обеспечивает необходимую мне функцию автозаполнения.

Обновление

Мы работали над этим вчера поздно вечером и пришли к частичному решению.Теперь у нас есть новый выпуск.

С помощью ComboBox вы можете иметь: DisplayMemberPath = "StateAbbrv" SelectedValue = "{Путь привязки = tbl_Address.StateID, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged}" и
SelectedValuePath = "StateID".*

С AutoCompleteBox кажется, что у вас действительно есть только: ValueMemberPath = "StateID" и Text = "{Binding Path = tbl_Address.StateID, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged, Converter = {StaticResource StateConverter}}" Grid.Column= "1" Grid.Row = "1" Margin = "0,0,0,0">

С AutoCompleteBox вы не можете иметь отдельный дисплей и выбранные значения.Из-за привязки элемента управления Window и структуры базы данных мне нужно отображать строковое значение, например «CA California», в то время как на заднем плане фактически выбрано целочисленное значение ключа таблицы.

Чтобы было ясно, нам нужно иметь отдельноеОтобразить и выбранные значения в текстовой части элемента управления AutoCompleteBox.

Вот мастер-список, отображающий подрядчиков:

    <Grid DataContext="{StaticResource tbl_PartnerViewSource}" HorizontalAlignment="Left" Name="grid3" VerticalAlignment="Top" Height="242" Width="295" Grid.Column="1" Margin="0,1,0,0" Grid.Row="3">
        <Grid.RowDefinitions>
            <RowDefinition Height="31*" />
            <RowDefinition Height="211*" />
        </Grid.RowDefinitions>
        <Label Content="Contractor List" FontWeight="Bold" Height="25" Margin="0,0,169,0" Name="label10" Padding="3" VerticalAlignment="Top" />
        <ListBox DisplayMemberPath="tbl_Organization.OrgName" Height="212" HorizontalAlignment="Right" ItemsSource="{Binding}" Margin="0,30,0,0" Name="orgNameListBox" SelectedValuePath="PtnrID"  VerticalAlignment="Center" Width="294" IsSynchronizedWithCurrentItem="True" Grid.RowSpan="2" SelectionChanged="orgNameListBox_SelectionChanged" TabIndex="11" MouseDoubleClick="orgNameListBox_MouseDoubleClick" DataContextChanged="orgNameListBox_DataContextChanged" SourceUpdated="orgNameListBox_SourceUpdated" IsManipulationEnabled="True" />
    </Grid>

Вот панель стека, содержащая Datacontext, поддерживающий обсуждаемые элементы управления:

<StackPanel Grid.Row="3" Height="243" HorizontalAlignment="Left" Name="stackPanel5" VerticalAlignment="Top" Width="295" Grid.Column="1"></StackPanel>
    <Label Content="Address(s)" FontWeight="Bold" Height="25" HorizontalAlignment="Left" Margin="306,0,0,0" Name="label1" Padding="3" VerticalAlignment="Top" Width="648" Grid.Column="1" Grid.Row="1" />
    <DataGrid Name="dataGridAddress" DataContext="{StaticResource tbl_Partnertbl_PartnerAddressViewSource}"  ItemsSource="{Binding}" SelectionMode="Single" SelectionUnit="CellOrRowHeader" AutoGenerateColumns="False" AlternatingRowBackground="#FFFF003B" AlternationCount="2" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" Margin="308,22,0,0" Width="649" Height="113" VerticalAlignment="Top" CanUserDeleteRows="True" CanUserAddRows="True">
        <DataGrid.Columns>...

Вот AutoCompleteBox, который частично работает:

<DataGridTemplateColumn x:Name="addState" Header="State" Width="100">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <my1:AutoCompleteBox Name="autoCompleteBox1" 
                                                 IsTextCompletionEnabled="True" 
                                                 ItemsSource="{Binding Source={StaticResource tbl_StateViewSource}}"
                                                 ValueMemberPath="StateID"
                                                 Text="{Binding Path=tbl_Address.StateID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="1" Margin="0,0,0,0" >
                                <my1:AutoCompleteBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding Path=StateAbbrv}" Width="30" FontWeight="Bold" Margin="0,0,0,0" />
                                            <TextBlock Text="{Binding Path=StateName}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </my1:AutoCompleteBox.ItemTemplate>
                            </my1:AutoCompleteBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

Вот Combobox с работающей привязкой TwoWay:

<GridViewColumn x:Name="addrState" Header="State" Width="75">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <ComboBox Name="comboAddressState" SelectedValue="{Binding Path=tbl_Address.StateID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  Margin="{StaticResource Margin2}" DisplayMemberPath="StateAbbrv" SelectedValuePath="StateID" ItemsSource="{Binding Source={StaticResource tbl_StateViewSource}}" IsSynchronizedWithCurrentItem="False" IsEnabled="True" />
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>

Вот Windows.Раздел ресурсов:

 <Window.Resources>
    <CollectionViewSource x:Key="tbl_PartnerViewSource" d:DesignSource="{d:DesignInstance my:tbl_Partner, CreateList=True}"></CollectionViewSource>
    <CollectionViewSource x:Key="tbl_Partnertbl_PartnerAddressViewSource" Source="{Binding Path=tbl_PartnerAddress, Source={StaticResource tbl_PartnerViewSource}}" />
    <CollectionViewSource x:Key="tbl_Partnertbl_PartnerContactViewSource" Source="{Binding Path=tbl_PartnerContact, Source={StaticResource tbl_PartnerViewSource}}" />
    <CollectionViewSource x:Key="tbl_Partnertbl_PartnerContacttbl_PartnerContactCommChanAddrViewSource" Source="{Binding Path=tbl_PartnerContactCommChanAddr, Source={StaticResource tbl_Partnertbl_PartnerContactViewSource}}" />
    <CollectionViewSource x:Key="tbl_Partnertbl_PartnerSystemViewSource" Source="{Binding Path=tbl_PartnerSystem, Source={StaticResource tbl_PartnerViewSource}}" />
    <CollectionViewSource x:Key="tbl_Partnertbl_PartnerAliasViewSource" Source="{Binding Path=tbl_PartnerAlias, Source={StaticResource tbl_PartnerViewSource}}" />
    <CollectionViewSource x:Key="tbl_Partnertbl_PartnerCommentViewSource" Source="{Binding Path=tbl_PartnerComment, Source={StaticResource tbl_PartnerViewSource}}" />
    <CollectionViewSource x:Key="tbl_ServicedCustomerViewSource"  d:DesignSource="{d:DesignInstance my:tbl_ServicedCustomer, CreateList=True}"  />
    <CollectionViewSource x:Key="tbl_SystemViewSource" d:DesignSource="{d:DesignInstance my:tbl_System, CreateList=True}" />
    <CollectionViewSource x:Key="tbl_PlatformViewSource" d:DesignSource="{d:DesignInstance my:tbl_Platform, CreateList=True}" />
    <CollectionViewSource x:Key="tbl_ManufacturerViewSource" d:DesignSource="{d:DesignInstance my:tbl_Manufacturer, CreateList=True}" />
    <CollectionViewSource x:Key="tbl_StateViewSource" d:DesignSource="{d:DesignInstance my:tbl_State, CreateList=True}" />
    <CollectionViewSource x:Key="tbl_ZIPViewSource" d:DesignSource="{d:DesignInstance my:tbl_ZIP, CreateList=True}" />
    <CollectionViewSource x:Key="tbl_CityViewSource" d:DesignSource="{d:DesignInstance my:tbl_City, CreateList=True}" />
    <Thickness x:Key="Margin1">8,-3,-7,-3</Thickness>
    <Thickness x:Key="Margin2">-7,-3,-7,-3</Thickness>
</Window.Resources>

Вот изображение окна (WPF):

enter image description here

...