单击子按钮时删除父UserControl

时间:2018-08-18 14:56:09

标签: c# .net wpf xaml

我要在堆栈面板中添加一个UserControl,并且该UserControl包含一个按钮。我试图在单击它的儿童按钮时删除该UserControl。但这不起作用!
StackPanel

<StackPanel Name="StackPanelContainer" Grid.Row="3"> </StackPanel>

在StackPanel中添加控件

private void NewProducModule(object sender, RoutedEventArgs e)
{
    UserControl productModules = new AddProductModule();
    productModules.Name = "Product" + StackPanelContainer.Children.Count;
    StackPanelContainer.Children.Add(productModules);
}

UserControl子按钮的点击方法

private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{
    FrameworkElement parent=(FrameworkElement)((Button)sender).Parent;
    NewInvoiceControl newInvoiceControl = new NewInvoiceControl();
    newInvoiceControl.StackPanelContainer.Children.Remove(parent);
}

2 个答案:

答案 0 :(得分:0)

尝试从其子项中清除 StackPanel。 StackPanel 井倒塌了。

private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{ 
    StackPanelContainer.Children.Clear(); 
}

或者你可以从它的父级中删除 StackPanel。如果你认识父母。

private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{ 
    var parent = (StackPanel)StackPanelContainer.Parent;

    parent.Children.Remove(StackPanelContainer); 
}

答案 1 :(得分:0)

对于按钮中的操作,它缺少数据。 在命令参数中设置对面板的绑定:
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type StackPanel}}}"

在答题器中,从参数中提取面板并从中删除 UserControl。 假设“DeleteSelfProduct”方法位于 UserControl 背后的代码中的示例:

private void DeleteSelfProduct(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    if (button.CommandParameter is Panel panel)
        panel.Children.Remove(this);
}

P.S. 虽然这应该会有所帮助,但我仍然建议您仔细查看 MVVM 模式中的典型 WPF 实现。 您不应该(如果正确实现)在 Sharp 代码中创建甚至只是引用 WPF UI 元素。 您只需要在 Sharpe 上准备 WPF 所需的数据。 但是它们的表示(包括动态创建、修改等)必须在 XAML 中完全定义。 XAML 是 WPF 的核心语言。 您需要探索它的所有功能:DataContext、Binding、DataTemplate、Style 等等。