我有一个
DataGrid
,其中包含 Transactions
。我有一个 InterestOrDividend
列,我可以使用 ComboBox
选择一个值。这很好用。
一个新功能是输入一个值并将其添加到可能性列表中。我将
IsEditable
设置为 true
并从 Interaction.Triggers
添加
http://schemas.microsoft.com/expression/2010/interactivity
问题1: 似乎
InterestOrDividendSelectionChangedCommand
不仅在选择更改时触发,而且在我滚动 DataGrid 并且此类行进入视图且在 InterestOrDividend
列中具有非空值时也会触发。此外,当输入新值(不在列表中)时,该事件不会触发。
问题2: 我想绑定
Text
的 ComboBox
属性来获取新添加的值。事件似乎在 Text
属性更改之前触发,所以我得到了旧值。
<DataGridTemplateColumn Header="{x:Static r:Resource.InterestOrDividend}"
CellTemplate="{StaticResource InterestOrDividendEditingTemplate}"
CellEditingTemplate="{StaticResource InterestOrDividendEditingTemplate}" />
<DataTemplate x:Key="InterestOrDividendEditingTemplate">
<ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}, Path=DataContext.AppData.AlienTypeObjects}"
SelectedItem="{Binding InterestOrDividend}"
DisplayMemberPath="FullName"
IsEditable="True"
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}},
Path=DataContext.InterestOrDividendSelectionChangedCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type ComboBox}}, Path=Text}"
/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
这是我的解决方案。
如果选择了现有类别,则 SelectedItem 会更新
如果输入新类别,则会根据文本属性创建新类别
NewCategory 在 PropertyChanged 处更新,因此在类别设置时 NewCategory 已准备就绪
NewCategory 使用 OneWayToSource 模式,否则设置了 SelectedItem 但 Text 被覆盖为 null
需要 DoNotNotify,否则“事务”选项卡上的“刷新”按钮将始终为红色
NewCategory 只是 DisplayTransaction 的辅助属性
<DataTemplate x:Key="CategoryEditingTemplate">
<ComboBox VerticalContentAlignment="Center" DisplayMemberPath="FullName"
IsEditable="True"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.CollectionAndDefault.CategoryObjects}"
SelectedItem="{Binding Category, UpdateSourceTrigger=LostFocus}"
Style="{StaticResource ComboBoxError}"
Text="{Binding NewCategory, UpdateSourceTrigger=PropertyChanged, Mode=OneWayToSource}"
ToolTip="{Binding Category.FullName}" />
</DataTemplate>