Как добавить автозаполнение в сетку данных? - PullRequest
3 голосов
/ 21 апреля 2011

В моем приложении есть сетка данных с двумя столбцами и 4 строками.Каждая из ячеек должна быть элементом управления автозаполнением WPF Toolkit.Я хотел бы реализовать все это с использованием шаблона MVVM.Легко заполнить ячейки текстовыми полями:

<DataGrid ItemsSource="{Binding viewModel, Path=Fields}"  AutoGenerateColumns="False" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro">
            <DataGrid.Columns>                    
                <DataGridTextColumn Header="Predicate" Binding="{Binding Key}"/>                
                <DataGridTextColumn Header="Value" Binding="{Binding Value}"/>
            </DataGrid.Columns>
</DataGrid>

Но попытка сделать то же самое с полями автозаполнения по какой-то причине не работает.Он компилируется и запускается, но окно автозаполнения не открывается при вводе.Я использовал:

<DataGrid ItemsSource="{Binding viewModel, Path=Fields}"  AutoGenerateColumns="False" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Pre">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <wpfToolkit:AutoCompleteBox ItemsSource="{Binding viewModel, Path=AvailableFields}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
</DataGrid>

Определения связанных свойств:

public IEnumerable<KeyValuePair<string, string>> Fields
public IEnumerable<string> AvailableFields

Есть идеи?

Обновление :весь XAML на основе ответа @Damascus.По какой-то причине тоже не работает.

<UserControl x:Class="IKB.Views.IKBInputView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:vm="clr-namespace:IKB.ViewModels"
             xmlns:wpfToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <vm:IKBInputVM x:Key="viewModel" />
    </UserControl.Resources>
    <StackPanel Orientation="Vertical">        
        <DataGrid ItemsSource="{Binding viewModel, Path=Fields}"  AutoGenerateColumns="False" CanUserResizeColumns="True" CanUserSortColumns="True" AlternatingRowBackground="Gainsboro">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Pre">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <wpfToolkit:AutoCompleteBox ItemsSource="{Binding DataContext.viewModel.AvailableFields, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>
</UserControl>

1 Ответ

1 голос
/ 21 апреля 2011

Это потому, что вы не находитесь в том же DataContext здесь.

Каждый AutoCompleteBox будет иметь свой собственный DataContext (не уверен насчет его точного положения, но он связан с текущей ячейкойсам), поэтому он будет искать ItemsSource не в том месте.

Ваш Binding должен ссылаться на исходный DataContext.Предполагая, что эта DataGrid находится в UserControl, попробуйте:

<wpfToolkit:AutoCompleteBox ItemsSource="{Binding DataContext.viewModel.AvailableFields,
           RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}} />

Это должно сработать (теперь мы посмотрим на DataContext UserControl, с которым вы работаете)

...