简体   繁体   English

如何在动态列表框中实现“添加新项”文本并更改其在添加项上的位置?

[英]How can I implement “add new item” text in dynamic listbox and change its position on item added?

I have dynamic listbox bound with observable collection and contains textbox to display list property. 我有与可观察集合绑定的动态列表框,并且包含用于显示列表属性的文本框。 I want "add new label" as a last item of listbox and click on label turns into textbox which is bound with listbox data template. 我想将“添加新标签”作为列表框的最后一项,然后单击标签变成文本框,该文本框与列表框数据模板绑定。 So visual structure is like this: 所以视觉结构是这样的:

Scenario 1: When No item in listbox: 方案1:当列表框中没有项目时:

ListBox: 列表框:

  1. Add new Item 新增项目

Scenario 2: When 3 items in listbox: 方案2:当列表框中有3个项目时:

ListBox: 列表框:

  1. Item1 项目1
  2. Item2 项目2
  3. Item3 项目3
  4. Add new Item 新增项目

When user click on add new item, that label should be replaced by textbox and user can add new item in it. 当用户单击添加新项目时,该标签应替换为文本框,并且用户可以在其中添加新项目。 And "Add New Item" label moved down one step. 并且“添加新项”标签下移了一步。

Anyone knows how can I do that in WPF? 谁知道在WPF中我该怎么做?

My code: 我的代码:

 <ListBox Name="ListUrls"   ItemsSource="{Binding . ,Source=ListSourceCollection,BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}"
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100" />
                        <ColumnDefinition Width="30" />
                        <ColumnDefinition Width="30"/>
                    </Grid.ColumnDefinitions>
                    <RadioButton>
                        <WrapPanel>
                        <TextBox Name="TextBoxList" Text="{Binding Path=urlString, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Focusable="{Binding IsEditing}" FocusableChanged="TextBoxList_FocusableChanged" Background="Transparent" Margin="0" BorderThickness="0" Width="150" Foreground="Gray" MouseEnter="TextBoxList_MouseEnter" MouseLeave="TextBoxList_MouseLeave">                
                        </TextBox>
                        </WrapPanel>
                    </RadioButton>

                    <ToggleButton Name="EditButton" Content="Edit" Grid.Column="1" Click="Button_Click" IsChecked="{Binding IsEditing}" HorizontalAlignment="Right" Margin="0">
                        <ToggleButton.Style>
                            <Style TargetType="ToggleButton">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding IsEditing}" Value="False"></Condition>
                                            <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}" Value="True"></Condition>
                                        </MultiDataTrigger.Conditions>

                                        <MultiDataTrigger.Setters>
                                            <Setter Property="Visibility" Value="Visible"/>
                                        </MultiDataTrigger.Setters>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ToggleButton.Style>
                    </ToggleButton>


                    <Button Content="Delete" Grid.Column="2" Click="Button_Click_1" HorizontalAlignment="Right" Margin="0">
                        <Button.Style>
                            <Style TargetType="Button">
                                <Setter Property="Visibility" Value="Collapsed" />
                                <Style.Triggers>
                                    <MultiDataTrigger>
                                        <MultiDataTrigger.Conditions>
                                            <Condition Binding="{Binding IsEditing}" Value="False"></Condition>
                                            <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1}, Path=IsSelected}" Value="True"></Condition>
                                        </MultiDataTrigger.Conditions>
                                        <MultiDataTrigger.Setters>
                                            <Setter Property="Visibility" Value="Visible"/>
                                        </MultiDataTrigger.Setters>
                                    </MultiDataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>

                </Grid>
            </DataTemplate>

        </ListBox.ItemTemplate>

    </ListBox> 

To have a "Static" property in your ListView you need: 要在ListView具有“静态”属性,您需要:

<CollectionViewSource Source="{Binding ObservableCollection}" x:Key="requiredList"/>

in your ListView you assign ItemsSource like so: ListView您可以按以下方式分配ItemsSource

<ListView.ItemsSource>
<CompositeCollection>
    <CollectionContainer Collection="{Binding Source={StaticResource requiredPeople}}"/>
</CompositeCollection>
</ListView.ItemsSource>
<Button Content="Add new Item" Command="..." ComandParameter="..."/>

I can't remember if you need to wrap the button in ListViewItem or not. 我不记得是否需要将按钮包装在ListViewItem中。

Please bare in mind that you will need temporary field on your VM to bind it to the DataTemplate. 请记住,您将需要在VM上使用临时字段将其绑定到DataTemplate。
You will also need ICommand on your VM this way you can add new Item to your collection when you handle your command. 您还需要在VM上使用ICommand ,这样您就可以在处理命令时将新Item添加到集合中。
NOTE: 注意:
This is from my head I don't guarantee that this will work but it should give you an idea of how to tackle the problem. 从我的角度来看,我不能保证这会成功,但是它应该使您知道如何解决该问题。
EDIT 编辑
Instead of the Source use Collection in the CollectionContainer . 代替Source使用Collection中的CollectionContainer

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM