首页 文章

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

提问于
浏览
0

我有一个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列表(这只是一个字典) . 现在边框变成了红色,虽然它确实更新了OC内部对象的“Name”属性,但它并不真实,因为它不能设置ActivityId,因为它实际上并不存在于AvailableActivities列表中 .

我已经为SelectionChanged和LostFocus尝试过EventToCommand,但是当输入一个新值时,我返回的值是'null',所以我无法添加它 .

通常我可以将文本值绑定到VM上的属性,然后在那里完成所有操作,但由于它是TaskActivity对象的ObservableCollection中的属性,我不确定是否可行 .

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

1 回答

  • 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”集合中 .

相关问题