动态堆栈的ComboBoxes试图添加新项目

时间:2014-05-11 02:22:43

标签: c# wpf mvvm combobox mvvm-light

我有一个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中的属性,我不确定是什么可能的。

有关实现此功能的任何建议吗?

1 个答案:

答案 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”集合中。