0

我在 WPF 表单上使用了 AutoCompleteBox 没有问题。现在我想在 WPF DataGrid 中做同样的事情。除了 SelectedItem 的设置器之外,几乎所有东西都有效。我看到 getter 被调用,但是在输入一个值并点击选项卡(或使用箭头键)之后,setter 永远不会被调用。在控制台输出中,我没有看到任何绑定错误。我希望有人能告诉我我做错了什么以及如何让 SelectedItem 在 ViewModel 类中的属性上触发 setter,当它位于 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>

4

1 回答 1

0

啊,我想我知道那是什么 - 我称之为“害羞数据上下文”的缺陷 - 尝试将您的 Hots:AutoCompleteBoxEx DataContext 设置为:

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

检查它的方法是创建一个虚拟转换器并像这样使用它:

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

然后在其 Convert 中放置一个断点并检查该值。由于没有指定路径 - 输入值是 DataContext 本身,如果它为空,那么它永远不会被设置/丢失。

于 2012-01-05T20:10:53.280 回答