【问题标题】:Adding new element to a ComboBox which is in a DataGrid in WPF using MVVM使用 MVVM 将新元素添加到 WPF 中的 DataGrid 中的 ComboBox
【发布时间】:2021-03-29 20:30:17
【问题描述】:

我有一个DataGrid,其中包含Transactions。我有一个InterestOrDividend 列,我可以在其中使用ComboBox 选择一个值。这很好用。

一个新功能是输入一个值并将其添加到可能性列表中。我将IsEditable 设置为true 并从http://schemas.microsoft.com/expression/2010/interactivity 添加Interaction.Triggers

问题 1: 似乎InterestOrDividendSelectionChangedCommand 不仅会在选择更改时触发,而且还会在我滚动 DataGrid 并且这些行进入视图时触发,这些行在InterestOrDividend 列中具有非空值。此外,当输入一个新值(不在列表中)时,该事件不会触发。

问题 2: 我想绑定ComboBoxText属性来获取新增的值。似乎在 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】:

    这是我的解决方案。我没有使用EventTrigger,而是在NewInterestOrDividend 的setter 中捕获了新元素。 UpdateSourceTriggerLostFocus,这一点很重要。当InterestOrDividend 为空并且您更改焦点时,NewInterestOrDividend 中的value 包含新值。

        <DataTemplate x:Key="InterestOrDividendEditingTemplate">
            <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, 
                                AncestorType={x:Type DataGrid}}, Path=DataContext.AppData.AlienTypeObjects}" 
                      DisplayMemberPath="FullName" Style="{StaticResource ComboBoxError}" 
                      IsEditable="True" 
                      SelectedItem="{Binding InterestOrDividend, UpdateSourceTrigger=LostFocus}" 
                      Text="{Binding NewInterestOrDividend, UpdateSourceTrigger=LostFocus}">
            </ComboBox>
        </DataTemplate>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 2011-04-08
      • 2010-12-02
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多