使用 MVVM 将新元素添加到 WPF 中 DataGrid 中的 ComboBox

问题描述 投票:0回答:1

我有一个

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>
c# mvvm combobox binding expression-blend
1个回答
0
投票

这是我的解决方案。

  • 如果选择了现有类别,则 SelectedItem 会更新

  • 如果输入新类别,则会根据文本属性创建新类别

  • NewCategory 在 PropertyChanged 处更新,因此在类别设置时 NewCategory 已准备就绪

    • 如果使用 LostFocus,则不能保证 NewCategory 在 Category 之前设置
  • 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>
      
© www.soinside.com 2019 - 2024. All rights reserved.