Как мне заставить WPF DataGrid и выбранный элемент AutoCompleteBox играть хорошо? - PullRequest
0 голосов
/ 05 января 2012

Я без проблем использовал AutoCompleteBox в форме WPF.Теперь я хотел бы сделать то же самое внутри WPF DataGrid.Почти все работает, кроме установщика для SelectedItem.Я вижу, как вызывается геттер, но после ввода значения и нажатия на вкладку (или использования клавиш со стрелками) сеттер никогда не вызывается.В выводе консоли я не вижу ошибок привязки.Я надеюсь, что кто-то может сказать мне, что я делаю неправильно и как заставить SelectedItem запускать метод установки для свойства в классе ViewModel, когда он находится внутри DataGrid.Сначала фрагмент класса ViewModel:

    public static List<ImpaSimple> AllImpas { get { return ImpaListRepository.ImpaList; } }
    private ImpaSimple _selectedImpa;

    public ImpaSimple SelectedImpa
    {
        get { return _selectedImpa; }
        set
        {
            if (value == _selectedImpa) return;
            _selectedImpa = value;
            //Manually set Description and Unit fields because user can override the IMPA default values.
           // Description = _selectedImpa.Name;
            //TODO Set Units too
            RaisePropertyChanged("SelectedImpa");
        }
    }

XAML

В XAML ниже я добавил код для обработчика LostFocus в качестве временного обходного пути.Добавление атрибута UpdateSourceTrigger также было попыткой заставить это работать.

<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
    <TextBlock  Style="{StaticResource DataGridHeader}">LImpa</TextBlock>
</DataGridTemplateColumn.Header>
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <Hots:AutoCompleteBoxEx ToolTip="Start typing an IMPA number"
                                ItemsSource="{Binding AllImpas}"
                                Width="50"
                                HorizontalContentAlignment="Left"
                                FilterMode="StartsWith"
                                IsDropDownOpen="True"
                                IsTextCompletionEnabled="True"
                                LostFocus="ImpaBoxExLostFocus"
                                SelectedItem="{Binding SelectedImpa, 
                                                        Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <Hots:AutoCompleteBoxEx.ItemTemplate>
                <DataTemplate>
                    <Grid Width="450">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="50" />
                            <ColumnDefinition Width="275" />
                            <ColumnDefinition Width="50" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding ImpaId}"
                                   Grid.Column="0" />
                        <TextBlock Text="{Binding Name}"
                                   Grid.Column="1" />
                        <TextBlock Text="{Binding Unit}"
                                   Grid.Column="2" />
                    </Grid>
                </DataTemplate>
            </Hots:AutoCompleteBoxEx.ItemTemplate>
        </Hots:AutoCompleteBoxEx>

    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

1 Ответ

0 голосов
/ 06 января 2012

Ах, я думаю, я знаю, что это такое - дефект, который я называю «застенчивый текстовый текст» - попробуйте установить свой Hots: AutoCompleteBoxEx DataContext to:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourDataSourceItemType}}}"

Способ проверить это - создать фиктивный конвертер и использовать его так:

ItemsSource="{Binding Converter={StaticResource DummyConverter}}"

затем поместите точку останова в конвертирование и проверьте значение. Поскольку путь не указан - входным значением является сам DataContext, если он нулевой, то он никогда не устанавливается / теряется.

...