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