【问题标题】:WPF Generating 1 row with 2 ComboBoxes + 1 Watermark On each click of the buttonWPF 生成 1 行,带有 2 个组合框 + 1 个水印每次单击按钮
【发布时间】:2026-01-28 22:50:01
【问题描述】:

所以目前我已经成功地从 button_click 上的代码隐藏生成单行重复元素。但是,我需要它们在每次单击按钮时生成。 IE。每次点击生成 + 1 行。 这是我的代码 sn-p 关于它是如何生成的:

// Items to populate Simulator Transaction Type List!r
private class Item 
{
    public string Name;

    public Item(string name)
    {
        Name = name;
    }
    public override string ToString()
    {
        // Generates the text shown in the combo box
        return Name;
    }
}

public void btnAddSimFields_Click(object sender, RoutedEventArgs e)
{    
    var newTypeBox = new ComboBox();
    {
        newTypeBox.Height = 22;
        newTypeBox.Width = 137;
        newTypeBox.Margin = new Thickness(10, 90, 323, 0);
        newTypeBox.VerticalAlignment = VerticalAlignment.Top;
        newTypeBox.Text = "Select an Action...";
        newTypeBox.IsEditable = true;
        newTypeBox.Items.Add(new Item("Buy"));
        newTypeBox.Items.Add(new Item("Sell"));
        newTypeBox.Items.Add(new Item("Sell Full Amount"));
    }
    var newCoinBox = new ComboBox();
    {
        newCoinBox.Height = 22;
        newCoinBox.Width = 137;
        newCoinBox.Text = "Select a coin";
        newCoinBox.VerticalAlignment = VerticalAlignment.Top;
        newCoinBox.Margin = new Thickness(166, 90, 167, 0);
        newCoinBox.ItemsSource = cmbListCoins.Items;
        newCoinBox.IsEditable = true;

    }

    var newWaterMark = new WatermarkTextBox();
    {
        newWaterMark.Height = 22;
        newWaterMark.Width = 120;
        newWaterMark.HorizontalAlignment = HorizontalAlignment.Left;
        newWaterMark.VerticalAlignment = VerticalAlignment.Top;
        newWaterMark.Margin = new Thickness(323, 90, 27, 0);
        newWaterMark.Watermark = "Quantity...";
    }


    gridSimBoxes.Children.Add(newTypeBox);
    gridSimBoxes.Children.Add(newCoinBox);
    gridSimBoxes.Children.Add(newWaterMark);
}

所以我在这里添加它们是正确的,它们会生成一切都很好而且花花公子。我的一般问题是如何在每次单击时继续添加它们,我正在讨论 foreach 或 for 循环。我很困惑。它们还应该能够绑定到一组全球可用的资源。

提前致谢,

维克多, 失去的实习生

【问题讨论】:

    标签: c# wpf combobox code-behind dynamically-generated


    【解决方案1】:

    我认为您实际上是在每次点击时创建了两个组合框和水印。但是,由于每次点击时它们的边距始终设置为相同的值。您只需将项目堆叠在完全相同的位置上的旧项目上,因此“看起来”每次点击后您都不会创建任何东西。

    尝试将您的 Grid 定义更改为您的 xaml,如下所示:

            <Grid x:Name="gridSimBoxes">
                <StackPanel Orientation="Horizontal">
                    <StackPanel Orientation="Vertical" x:Name="StackpanelTypeBox"/>
                    <StackPanel Orientation="Vertical" x:Name="StackpanelCoinBox"/>
                    <StackPanel Orientation="Vertical" x:Name="StackpanelWatermark"/>
                </StackPanel>                
            </Grid>
    

    然后在您的代码中将您创建的项目添加到每个堆栈面板:

        StackpanelTypeBox.Children.Add(newTypeBox);
        StackpanelCoinBox.Children.Add(newCoinBox);
        StackpanelWatermark.Children.Add(newWaterMark);
    

    你会看到每次点击后你已经创建了所有三个项目:)

    【讨论】:

    • 非常感谢它的工作原理,但是出现了第 2 个问题。我现在必须将它们绑定到 ItemsSource(已经完成)。但我还需要在 IF/else 语句中引用它们,因为它们选择的值会在函数中产生差异。例如,如果其中一个孩子有“购买”,请尝试 { // Some code } catch { // Some Exception }
    • 这个答案可能会更长,我强烈建议你避免在完整的代码后面做这样的事情。在我看来,我会创建一些带有 Item 和 buyStatus 作为布尔值的实体集合,然后将它们在 xaml 中绑定到 ItemControl。然后,您将能够在布尔“BuyingStatus”的设置器中执行您想要的代码
    • 但是如果你想坚持你的代码,一种可能的解决方法是添加带有复选框的第四列,将 Item 对象存储在某处(可能在 Checkbox 标签中)并手动注册检查/未检查事件。然后在checked/unchecked事件方法中可以通过sender参数取回checkbox相关的item(必须强制转换成Checkbox才能访问tag属性)但是真的很脏
    • Jonathan Perennes 我不太清楚你的第一条评论是什么意思。您可以指出我的任何来源或类似的例子吗?提前致谢!
    最近更新 更多