我有一个包含 Transactions 的 DataGrid 。我有一个 InterestOrDividend 列,可以在其中使用 ComboBox 选择值。这可以很好地工作。
Transactions
DataGrid
InterestOrDividend
ComboBox
一个新功能将是输入值并将其添加到可能性列表中。我将 IsEditable 设置为 true ,并从 http://schemas.microsoft.com/expression/2010/interactivity 添加了 Interaction.Triggers
IsEditable
true
http://schemas.microsoft.com/expression/2010/interactivity
Interaction.Triggers
问题1:似乎 InterestOrDividendSelectionChangedCommand 不仅会在更改选择时触发,而且还会在我滚动DataGrid时触发,这样的行会进入 InterestOrDividend 列中有一个非空值的视图。此外,当输入新值(不在列表中)时,事件不会触发。
InterestOrDividendSelectionChangedCommand
问题2:我想绑定 ComboBox 的 Text 属性来获取新添加的值。事件似乎是在 Text 属性更改之前触发的,所以我得到了旧值。
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>
上云精选
2核2G云服务器 每月9.33元起,个人开发者专属3年机 低至2.3折
这是我的解决方案。我在 NewInterestOrDividend 的 EventTrigger 方法中捕获新元素,而不是使用setter。重要的是, UpdateSourceTrigger 是 LostFocus 。当 InterestOrDividend 为null并且您更改焦点时, NewInterestOrDividend 中的 value 将包含新值。
NewInterestOrDividend
EventTrigger
UpdateSourceTrigger
LostFocus
value
<DataTemplate x:Key="InterestOrDividendEditingTemplate"> <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.AppData.AlienTypeObjects}"