我有一个Items控件绑定到一个可观察的TaskActivity对象集合。
<ItemsControl ItemsSource="{Binding TasksActivities, UpdateSourceTrigger=PropertyChanged}" Margin="20, 0, 20, 20">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="2, 0, 2, 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width= "*" />
<ColumnDefinition Width= "*" />
<ColumnDefinition Width= "*" />
<ColumnDefinition Width= "70"/>
</Grid.ColumnDefinitions>
<ComboBox x:Name="test" IsEditable="True" ItemsSource="{Binding Source={StaticResource Locator}, Path=Main.AvailableActivities, Mode=TwoWay}" SelectedValue="{Binding ActivityId}" Text="{Binding Name, UpdateSourceTrigger=LostFocus}" SelectedValuePath="Key" DisplayMemberPath="Value" HorizontalAlignment="Stretch" Grid.Column="0">
</ComboBox>
<TextBox Text="{Binding Length}" Grid.Column="1" />
<TextBox Text="{Binding Comment}" Grid.Column="2" />
<Button Height="24" Content="Remove" HorizontalAlignment="Right" Margin="10, 0, 10, 0" Style="{StaticResource LinkButton}" Grid.Column="3">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding Source={StaticResource Locator}, Path=Main.DeleteActivityCommand, Mode=OneWay}" CommandParameter="{Binding Name}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
当组合框中输入的值不存在并且焦点丢失时,我想出现一个提示,询问是否要将该值添加到AvailableActivities列表(这只是一个字典) )。现在边界变成红色,而它确实更新了&#34;名称&#34; OC中对象的属性,它不是真实的,因为它不能设置ActivityId,因为它实际上并不存在于AvailableActivities列表中。
我已经为SelectionChanged和LostFocus尝试了一个EventToCommand,但是当输入一个新值时,返回的值是&#39; null&#39;所以我无法添加它。
通常我可以将文本值绑定到VM上的属性,然后在那里完成所有操作,但由于它是TaskActivity对象的ObservableCollection中的属性,我不确定是什么可能的。
有关实现此功能的任何建议吗?
答案 0 :(得分:1)
首先使ComboBox.Text成为双向绑定,以便更新视图模型属性:
Text="{Binding Path=Name, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
有了这个,就可以在ComboBox的LostFocus
事件中添加一个命令:
<ComboBox>
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<cmd:EventToCommand Command="{Binding Source={StaticResource Locator},
Path=Main.AddNewActivityCommand}"
CommandParameter="{Binding ElementName=test,Path=Text}"
/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
最后,“AddNewActivityCommand”应该只将新项目(在“Name”属性中)添加到“AvailableActivities”集合中。