0

我在后面的代码中动态地将几个文本框添加到我的网格中。我希望能够捕获用户在这些文本框中输入的内容。

我不确定如何执行此操作,因为当我尝试将动态添加的文本框的名称添加到我的代码隐藏中时,它的名称不可用。

我想创建一个查询构建器工具。这是非常粗略的,但基本上我想添加多个组合框、文本框和按钮。

我想要完成的事情

4

3 回答 3

2

首先,你必须摒弃在代码中操纵 UI 元素的传统心态,拥抱MVVM

<Window x:Class="MiscSamples.QueryBuilderSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MiscSamples"
        Title="QueryBuilderSample" Height="300" Width="300">
    <ItemsControl ItemsSource="{Binding}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <ComboBox ItemsSource="{Binding Operators}" 
                              SelectedItem="{Binding Operator}"/>

                    <TextBox Text="{Binding Value}" Grid.Column="1"/>

                    <Button Content="Add" Grid.Column="2"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

后面的代码:

 public partial class QueryBuilderSample : Window
    {
        public List<QueryCriteria> Criterias { get; set; } 

        public QueryBuilderSample()
        {
            InitializeComponent();

            DataContext = Criterias = Enumerable.Range(0, 10).Select(x => new QueryCriteria()).ToList();
        }
    }

视图模型:

public class QueryCriteria
{
    public List<Operators> Operators
    {
        get
        {
            return Enum.GetValues(typeof(Operators))
                       .Cast<Operators>()
                       .ToList();
        }
    }

    public Operators Operator { get; set; }
    public string Value { get; set; }
}

public enum Operators
{
    Equals,
    Contains,
    GreaterThan,
    SmallerThan,
}

结果:

在此处输入图像描述

  • 请注意,我没有编写一行代码来创建/操作 UI 元素。一切都是通过DataBinding完成的。
  • 简单的代码。没有复杂的事件处理或类似的东西。
  • 声明性代码。只是简单,简单的属性和INotifyPropertyChanged. 这是 WPF 中一切的默认方法。
于 2013-05-15T18:05:18.373 回答
0

@jeff V,您可以使用分配这些文本框的名称来简单地捕获文本框文本。您正在使用 tb1,tb2 作为文本框名称...因此您可以使用轻松获取值

于 2013-05-15T17:25:27.527 回答
0

插入文本框时,请在某个对象中保留对它的引用。字典可能是一个不错的选择。这样,您可以稍后获取该引用,并从该引用中读取它的 Text 属性。

于 2013-05-15T17:23:30.987 回答