【问题标题】:Dynamic stack of ComboBoxes trying to add new items尝试添加新项目的组合框的动态堆栈
【发布时间】:2014-06-28 14:11:06
【问题描述】:

我有一个 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 内对象的“名称”属性,但它不是真实的,因为它无法设置 ActivityId,因为它实际上并不存在于可用活动列表中。

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

通常我可以将文本值绑定到 VM 上的属性并在那里完成所有操作,但由于它是 TaskActivity 对象的 ObservableCollection 内的属性,我不确定这是否可能。

对于实现这个功能有什么建议吗?

【问题讨论】:

    标签: c# wpf mvvm combobox mvvm-light


    【解决方案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”集合中。

    【讨论】:

    • 如果我只有 1 个硬编码的组合框,我通常会这样做。但不幸的是,如果你这样做,我会生成组合框,那么所有的组合框都将共享相同的值(Main.Name)。不过谢谢!
    • @Wrightboy 看看我更新的答案(已经很晚了,我犯了几个错误)。关键部分是 1)使 ComboBox.Text 成为 2 向绑定,2)在“LostFocus”触发器中添加“添加新活动”命令。
    • 啊,我明白了,与作为参数传递的文本非常接近。我在使用 LostFocus 时遇到的一个问题是,当我第一次单击组合框以及离开时会触发 Main.AddNewActivityCommand 命令。
    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2012-01-15
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多