Добавление нового элемента в поле со списком, которое находится в сетке данных в WPF, используя MVVM

#c# #mvvm #combobox #binding #expression-blend

#c# #mvvm #поле со списком #привязка #выражение-смешивание

Вопрос:

У меня есть DataGrid , который содержит Transactions . У меня есть InterestOrDividend столбец, в котором я могу выбрать значение с помощью a ComboBox . Это работает нормально.

Новой функцией было бы ввести значение и добавить его в список возможностей. Я установил IsEditable значение true и добавил Interaction.Triggers из http://schemas.microsoft.com/expression/2010/interactivity

Проблема 1: кажется InterestOrDividendSelectionChangedCommand , что срабатывает не только при изменении выбора, но и при прокрутке сетки данных, и появляются такие строки, которые имеют значение not null в 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>
 

Ответ №1:

Это мое решение. Вместо использования EventTrigger я перехватываю новый элемент в установщике NewInterestOrDividend . Важно, чтобы это UpdateSourceTrigger было LostFocus . Когда InterestOrDividend значение равно null и вы меняете фокус, тогда value in NewInterestOrDividend содержит новое значение.

     <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>