Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试添加新项的组合框的动态堆栈_C#_Wpf_Mvvm_Combobox_Mvvm Light - Fatal编程技术网

C# 尝试添加新项的组合框的动态堆栈

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="

我将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,因为它实际上不存在于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命令被激发。