我在WPF表单上使用了AutoCompleteBox没有问题。现在我想在WPF DataGrid中做同样的事情。除了SelectedItem的setter之外,几乎所有东西都有效。我看到getter被调用但是在输入一个值并点击tab(或使用箭头键)后,setter永远不会被调用。在控制台输出中,我看到没有绑定错误。我希望有人可以告诉我我做错了什么以及如何在ViewModel类中使用SelectedItem来触发属性,当它在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中,我为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>
答案 0 :(得分:0)
啊,我想我知道那是什么 - 我称之为“害羞的datacontext”的缺陷 - 尝试设置你的 Hots:AutoCompleteBoxEx DataContext to:
DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type YourDataSourceItemType}}}"
检查它的方法是创建一个虚拟转换器并使用它:
ItemsSource="{Binding Converter={StaticResource DummyConverter}}"
然后在其Convert中放置一个断点并检查该值。由于没有指定Path - 输入值是DataContext本身,如果它是null,那么它永远不会被设置/丢失。