Dapatkan properti .Text dari Textbox yang ditambahkan secara dinamis

Saya secara dinamis menambahkan beberapa kotak teks ke grid saya di kode saya di belakang. Saya ingin dapat menangkap apa yang dimasukkan pengguna ke dalam kotak teks tersebut.

Saya tidak yakin bagaimana melakukan ini karena nama kotak teks yang ditambahkan secara dinamis tidak tersedia ketika saya mencoba menambahkannya di belakang kode saya.

Saya ingin membuat alat pembuat kueri. Ini sangat tidak sopan tetapi pada dasarnya saya ingin menambahkan beberapa kotak kombo, kotak teks, dan tombol.

Apa yang ingin saya capai


person webdad3    schedule 15.05.2013    source sumber
comment
I am dynamically adding several textboxes to my grid in my code behind - Pendekatan yang salah. Pelajari MVVM. Gunakan ItemsControl. WPF bukan winform. Posting tangkapan layar dari apa yang Anda perlukan dan saya dapat memberi tahu Anda cara yang tepat untuk melakukannya di WPF.   -  person Federico Berasategui    schedule 15.05.2013
comment
Oke, apakah Anda punya tutorial bagus tentang ItemsControl?   -  person webdad3    schedule 15.05.2013
comment
Mungkin ini dapat membantu Anda. Namun, ini sedikit berbeda dari apa yang Anda gambarkan di sini. Posting tangkapan layar dari apa yang Anda butuhkan.   -  person Federico Berasategui    schedule 15.05.2013
comment
selesai - Saya menambahkan tangkapan layar yang SANGAT belum sempurna   -  person webdad3    schedule 15.05.2013
comment
Saya melakukan hal seperti ini di proyek c#...dalam ide saya mungkin Anda dapat mencari Kotak teks ini berdasarkan nama dan tipenya di grid anak-anak Anda. Saya melihat kode Anda sebelum Anda mengedit posting Anda sendiri, mungkin Anda bisa mendefinisikannya stackpanel Anda secara global dan kemudian cari kotak teks Anda melaluinya   -  person Fuad    schedule 15.05.2013
comment
@Fuad Lihat jawaban saya. Itulah pendekatan yang BENAR di WPF.   -  person Federico Berasategui    schedule 15.05.2013
comment
Yah..Saya mengerti...Menggunakan {Bindings} adalah cara yang biasa dan Benar di WPF...jawaban yang bagus teman. Terima kasih telah memberi tahu saya :)   -  person Fuad    schedule 15.05.2013


Jawaban (3)


Pertama-tama, Anda harus meninggalkan mentalitas tradisional dalam memanipulasi elemen UI dalam kode dan merangkul 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>

Kode di belakang:

 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();
        }
    }

Model Tampilan:

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,
}

Hasil:

masukkan deskripsi gambar di sini

  • Perhatikan bahwa saya tidak melakukan satu baris kode pun untuk membuat/memanipulasi elemen UI. Semuanya dilakukan melalui DataBinding.
  • Kode sederhana. Tidak ada kejadian rumit yang menangani hal-hal atau semacamnya.
  • Kode Deklaratif. Hanya Properti Sederhana dan Sederhana dan INotifyPropertyChanged. Itu adalah pendekatan default untuk SEMUANYA di WPF.
person Federico Berasategui    schedule 15.05.2013
comment
terima kasih banyak untuk kode ini. Sudah terlalu lama sejak saya melakukan MVVM, jadi saya menghargai pengarahan ulang - person webdad3; 16.05.2013

Saat Anda menyisipkan kotak teks, simpan referensi ke sana di beberapa objek. Kamus bisa menjadi pilihan yang baik. Dengan begitu, Anda bisa mendapatkan referensi tersebut nanti, dan dari referensi tersebut Anda bisa membaca properti Text-nya.

person Geeky Guy    schedule 15.05.2013
comment
-1 Hal ini mendorong penggunaan praktik buruk dan pola usang. - person Federico Berasategui; 15.05.2013

@jeff V Anda cukup mengambil teks kotak teks dengan menggunakan nama yang Anda tetapkan untuk kotak teks tersebut.. Anda menggunakan tb1,tb2 sebagai nama kotak teks...sehingga Anda dapat dengan mudah mendapatkan nilainya menggunakan

person Haji    schedule 15.05.2013
comment
-1 Tidak benar. tidak ada bidang yang dihasilkan yang dapat diakses saat melakukan ini. Ini juga cara yang salah untuk melakukannya. - person Federico Berasategui; 15.05.2013