รับคุณสมบัติ .Text จากกล่องข้อความที่เพิ่มแบบไดนามิก

ฉันกำลังเพิ่มกล่องข้อความหลายกล่องแบบไดนามิกลงในตารางของฉันในโค้ดด้านหลัง ฉันต้องการที่จะบันทึกสิ่งที่ผู้ใช้ป้อนลงในกล่องข้อความเหล่านั้น

ฉันไม่แน่ใจว่าต้องทำอย่างไรเนื่องจากชื่อของกล่องข้อความที่เพิ่มแบบไดนามิกไม่พร้อมใช้งานเมื่อฉันพยายามเพิ่มลงในโค้ดด้านหลัง

ฉันต้องการสร้างเครื่องมือสร้างแบบสอบถาม นี่เป็นสิ่งที่หยาบคายมาก แต่โดยพื้นฐานแล้ว ฉันต้องการเพิ่มคอมโบบ็อกซ์ กล่องข้อความ และปุ่มหลายรายการ

สิ่งที่ฉันพยายามทำให้สำเร็จ


person webdad3    schedule 15.05.2013    source แหล่งที่มา
comment
I am dynamically adding several textboxes to my grid in my code behind - แนวทางที่ไม่ถูกต้อง เรียนรู้ MVVM ใช้ ItemsControl WPF ไม่ใช่ winforms โพสต์ภาพหน้าจอของสิ่งที่คุณต้องการ แล้วฉันจะบอกวิธีที่เหมาะสมใน WPF ให้คุณได้   -  person Federico Berasategui    schedule 15.05.2013
comment
โอเค คุณมีบทช่วยสอนที่ดีเกี่ยวกับ ItemsControl หรือไม่?   -  person webdad3    schedule 15.05.2013
comment
บางทีสิ่งนี้อาจช่วยคุณได้ ถึงกระนั้น มันก็แตกต่างเล็กน้อยจากสิ่งที่คุณอธิบายไว้ที่นี่ โพสต์ภาพหน้าจอของสิ่งที่คุณต้องการ   -  person Federico Berasategui    schedule 15.05.2013
comment
เสร็จสิ้น - ฉันได้เพิ่มภาพหน้าจอพื้นฐานมาก   -  person webdad3    schedule 15.05.2013
comment
ฉันกำลังทำสิ่งนี้ในโปรเจ็กต์ c#...ในความคิดของฉัน บางทีคุณสามารถค้นหากล่องข้อความเหล่านี้ด้วยชื่อและประเภทในตารางลูกๆ ของคุณ ฉันเห็นรหัสของคุณก่อนที่คุณจะแก้ไขโพสต์ของคุณเอง บางทีคุณอาจกำหนดได้ สแต็คพาเนลของคุณทั่วโลก จากนั้นค้นหากล่องข้อความของคุณผ่านมัน   -  person Fuad    schedule 15.05.2013
comment
@Fuad ดูคำตอบของฉัน นั่นเป็นแนวทางที่ถูกต้องใน WPF   -  person Federico Berasategui    schedule 15.05.2013
comment
ใช่..ฉันเข้าใจแล้ว...การใช้ {Bindings} เป็นเรื่องปกติและเป็นวิธีการที่ถูกต้องใน WPF...คำตอบที่ดีเพื่อน ขอบคุณที่เตือนฉัน :)   -  person Fuad    schedule 15.05.2013


คำตอบ (3)


ก่อนอื่น คุณต้องละทิ้งความคิดแบบเดิมๆของการจัดการองค์ประกอบ UI ในโค้ด และ Embrace 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
person Federico Berasategui    schedule 15.05.2013
comment
ขอบคุณมากสำหรับรหัสนี้ มันนานเกินไปแล้วตั้งแต่ฉันทำ MVVM ใด ๆ ดังนั้นฉันจึงขอขอบคุณการเปลี่ยนเส้นทาง - person webdad3; 16.05.2013

เมื่อคุณแทรกกล่องข้อความ ให้คงการอ้างอิงกล่องข้อความนั้นไว้ในวัตถุบางอย่าง พจนานุกรมอาจเป็นทางเลือกที่ดี ด้วยวิธีนี้ คุณสามารถรับข้อมูลอ้างอิงนั้นได้ในภายหลัง และจากข้อมูลอ้างอิงนั้น คุณสามารถอ่านคุณสมบัติ ข้อความ ได้

person Geeky Guy    schedule 15.05.2013
comment
-1 สิ่งนี้ส่งเสริมการใช้แนวทางปฏิบัติที่ไม่ดีและรูปแบบที่ล้าสมัย - person Federico Berasategui; 15.05.2013

@jeff V คุณสามารถจับข้อความกล่องข้อความโดยใช้ชื่อที่คุณกำหนดกล่องข้อความเหล่านั้น .. คุณกำลังใช้ tb1, tb2 เป็นชื่อกล่องข้อความ ... เพื่อให้คุณสามารถรับค่าได้อย่างง่ายดายโดยใช้

person Haji    schedule 15.05.2013
comment
-1 ไม่จริง ไม่มีการสร้างฟิลด์ซึ่งสามารถเข้าถึงได้เมื่อทำเช่นนี้ นี่ก็เป็นวิธีที่ผิดเช่นกัน - person Federico Berasategui; 15.05.2013