C# 尝试添加新项的组合框的动态堆栈
我将Items控件绑定到TaskActivity对象的可观察集合C# 尝试添加新项的组合框的动态堆栈,c#,wpf,mvvm,combobox,mvvm-light,C#,Wpf,Mvvm,Combobox,Mvvm Light,我将Items控件绑定到TaskActivity对象的可观察集合 <ItemsControl ItemsSource="{Binding TasksActivities, UpdateSourceTrigger=PropertyChanged}" Margin="20, 0, 20, 20"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Margin="
<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列表(这只是一个字典)。现在边框变成红色,虽然它确实更新了OC中对象的“Name”属性,但它不是真的,因为它无法设置ActivityId,因为它实际上不存在于AvailableActivity列表中
我已经为SelectionChanged和LostFocus尝试了EventToCommand,但当输入新值时,返回的值为“null”,因此无法添加它
通常我可以将文本值绑定到VM上的一个属性,然后在那里完成所有操作,但由于它是TaskActivity对象的ObservableCollection中的一个属性,所以我不确定这是否可行
对实现此功能有何建议?首先将组合框文本设置为双向绑定,以便更新视图模型属性:
Text="{Binding Path=Name, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"
设置好后,向组合框的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”集合中。如果我只有一个硬编码的组合框,我通常会这样做。但不幸的是,由于我正在生成组合框,如果您这样做,那么所有组合框将共享相同的值(Main.Name)。谢谢你@Wrightboy看看我的最新答案(时间晚了,我犯了几个错误)。关键部分是1)使组合框。文本成为双向绑定,2)在“LostFocus”触发器中添加“AddNewActivity”命令。啊,我明白了,只需将文本作为参数传递,就非常接近已经存在的内容。我在LostFocus中遇到的一个问题是,当我第一次单击组合框时以及离开时,Main.AddNewActivityCommand命令被激发。