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

时间:2014-06-10 19:12:03

标签: c# wpf xaml dynamic listbox

我有动态列表框绑定了observable集合,并包含显示列表属性的文本框。我希望“添加新标签”作为列表框的最后一项,然后单击标签将变为与列表框数据模板绑定的文本框。所以视觉结构是这样的:

场景1:当列表框中没有项目时:

列表框:

  1. 添加新项目
  2. 场景2:当列表框中有3个项目时:

    列表框:

    1. 项目1
    2. 项目2
    3. 项目3
    4. 添加新项目
    5. 当用户点击添加新项目时,该标签应替换为文本框,用户可以在其中添加新项目。并且“添加新项目”标签向下移动了一步。

      任何人都知道如何在WPF中做到这一点?

      我的代码:

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

1 个答案:

答案 0 :(得分:1)

拥有&#34;静态&#34;您需要的ListView中的媒体资源:

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

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

VM

我无法记住你是否需要在ListViewItem中包装按钮。

请记住,ICommand上需要临时字段才能将其绑定到DataTemplate。
您还需要VM Source,这样您就可以在处理命令时将新项目添加到集合中。
注意:
这是我的头脑,我不保证这会有效,但它应该让你知道如何解决这个问题。
修改
而不是CollectionCollectionContainer使用{{1}}。