我需要在 运行 时间内删除在另一个 WrapPanel 内动态创建的 WrapPanel 内的控件

I need to Delete a Control inside a WrapPanel created dynamically inside another WrapPanel while in Run-Time

所以,我有一个名为 "valoresPanel" 的主要 WrapPanel。当我开始 运行 时,我需要单击标记为“2”(下方)的 Button,并且 TextBox 需要出现在标记为“1”的 WrapPanel 中运行时间。

这是我现在的“+ 按钮”代码:

void novoValor_Click(object sender, RoutedEventArgs e)
       {
           WrapPanel wpValores = new WrapPanel();

           Button deleteValor = new Button();
           TextBox txtValor = new TextBox();

           deleteValor.Height = 25;
           deleteValor.Width = 25;
           deleteValor.Content = "X";

           txtValor.Height = 25;
           txtValor.Width = 70;
           txtValor.Margin = new Thickness(0, 0, 8, 0);

           wpValores.Height = 25;
           wpValores.Width = 105;

           wpValores.Children.Add(deleteValor);
           wpValores.Children.Add(txtValor);

           valoresPanel.Children.Add(wpValores);

           deleteValor.Click += deleteValor2_Click;
       }  

所以,我更新了我的代码,每个项目只使用一个 WrapPanel,现在我可以添加一个项目,添加值并删除项目及其各自的值,但我不能删除一个特定的值,这是我现在的代码:

this image will help to understand

 void novoValor_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            WrapPanel wpFather = btn.Parent as WrapPanel;
            WrapPanel wpValue = new WrapPanel();

            Button deleteValue = new Button();
            TextBox txtValue = new TextBox();

            wpValue.Height = 25;
            wpValue.Width = 105;

            deleteValue.Height = 25;
            deleteValue.Width = 25;
            deleteValue.Content = "-";

            txtValue.Height = 25;
            txtValue.Width = 70;
            txtValue.Margin = new Thickness(0, 0, 8, 0);

            wpValue.Children.Add(deleteValue);
            wpValue.Children.Add(txtValue);

            wpFather.Children.Add(wpValue);

            deleteValue.Click += deleteValor_Click;
        }

        void deleteValor_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            WrapPanel panel = btn.Parent as WrapPanel;
            entradasPanel.Children.Remove(panel);
        }

如果有人需要任何其他信息,我愿意尽快发送!

您应该创建一个 ListView,它有一个 WrapPanel 作为 ItemsPanel。然后到 ListView.ItemsSource 绑定一个 ObservableCollection 数据模型。通过为 ListView.ItemTemplate 定义 DataTemplate,您可以使数据项显示为带有 ButtonTextBox,其中 TextBox 绑定到此项的数据模型.通过按下删除按钮,您只需从 ObservaleColectionListViewItemsSource)中删除此数据模型。

DataModel.cs

class DataModel
{
  public string UserInput { get; set; }
}

ViewModel.cs

class ViewModel
{
  public ObservableCollection<DataModel> Items { get; set; }
  public ICommand AddItemCommand => new AsyncRelayCommand(() => this.Items.Add(new DataModel()));    
  public ICommand RemoveItemCommand => new AsyncRelayCommand((item) => this.Items.Remove(item));

  public ViewModel()
  {
    this.Items = new ObservableCollection<DataModel>();
  }
}

MainWindow.xaml

<Window>
  <Window.DataContext>
    <ViewModel />
  </Window.DataContext>

  <StackPanel>
    <Button Content="Add Item"
            Command="{Binding AddItemCommand}" />

    <ListView ItemsSource="{Binding Items}">
      <ListView.ItemsPanel>
        <ItemsPanelTemplate>
          <WrapPanel Width="600" />
        </ItemsPanelTemplate>
      </ListView.ItemsPanel>

      <ListView.ItemTemplate>
        <DataTemplate DataType="{x:Type DataModel}">
          <StackPanel Orientation="Horizontal">
            <Button Content="Remove Item"
                    Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}, Path=DataContext.RemoveItemCommand}"
                    CommandParameter="{Binding}" />
            <TextBox Text="{Binding UserInput}" />
          </StackPanel>
        </DataTemplate>
      </ListView.ItemTemplate>
    </ListView>
  </StackPanel>
</Window>

我可以用下面的代码解决我的最后一个问题:

    void deleteValue_Click(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        WrapPanel panel = btn.Parent as WrapPanel;
        WrapPanel panelPai = panel.Parent as WrapPanel;
        panelPai.Children.Remove(panel);
    }