2017-02-08 12 views
2

У меня есть сетка. в каждой строке есть три столбца. 1stcolumn содержит TextBox, а 2-й и 3-й столбцы содержат TextBlock.wpf - динамически создавать и добавлять новые текстовые поля и текстовые блокировки в строку сетки при нажатии кнопки

Я добавил новую кнопку, и я хочу, чтобы всякий раз, когда пользователь нажимал на кнопку, она генерирует новую строку, содержащую TextBox на 1-ом столбце, а 2-й и 3-й столбцы содержат TextBlock.

Я делаю это сс Я хочу получить значение (имя) пользователь уже ввести на каждом Textbox, затем сделать некоторые веб-службы призваны извлекаемых соответствующие значения для показать на два текстовых блока в той же строке.

Я уже искал несколько потоков stackoverflow, связанных с этим, но в основном предлагаю вам реализовать обработчик событий buttonClicked(), добавив новый элемент управления (например, текстовое поле) в качестве дочернего элемента в макет сетки вместо использования MVVM.

Интересно Если бы я мог достичь этого с помощью MVVM? любое предложение?

+2

Не знаю, ваше приложение, однако, вы рассматривали использование DataGrid? – Ron

+0

Я думаю, это было бы изнурительно сделать это в MVVM. Это непросто, и MVVM уже достаточно сложный (большинство из которых я знаю, стараюсь оставаться как можно дальше от него, вместо этого они используют только Model - & - View). Событие для кнопки - это самый простой способ сделать это – Everyone

+2

Я бы не назвал MVVM исчерпывающим, есть немного настроек, но как только вы его на месте, это упрощает. Этот ответ (http://stackoverflow.com/a/24961352/4490), кажется, обеспечивает решение с использованием MVVM. – benPearce

ответ

1

При более близком рассмотрении комментариев выше @benPearce указал отличный ответ на тот же вопрос dynamically add controls. Надеюсь, дополнительная информация ниже поможет.

Чтобы добавить элементы управления, динамически используйте элемент ItemsControl или производную и привяжите к коллекции модели вида, которую вы хотите использовать. Это просто настоящий простой пример, который пропускает некоторые шаблонного для краткости:

XAML

<Window x:Class="MyWpfApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfApplication1" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition Height="3*"/> 
     </Grid.RowDefinitions> 
     <Button Content="Add New Entry" Command="{Binding AddNewEntryCommand}"/> 
     <ItemsControl Grid.Row="1" ItemsSource="{Binding TextEntryItems}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Label}"/> 
         <TextBox Text="{Binding Data}"/> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window> 

C#

namespace MyWpfApp { 
    public class MainWindowViewModel : INotifyPropertyChanged { 

     private void AddNewEntry() { 
      TextEntryItems.Add(new TextEntryViewModel("NewItem")); 
     } 

     private ObservableCollection<TextEntryViewModel> textEntryItems; 
     public ObservableCollection<TextEntryViewModel> TextEntryItems { get { return textEntryItems; } set { textEntryItems = value; FirePropertyChanged(); } } 

     public ICommand AddNewEntryCommand { get { new RelayCommand(AddNewEntry)} } 
    } 

    public class TextEntryViewModel : INotifyPropertyChanged { 

     public TextEntryViewModel(string label) { 
      Label = label; 
     } 

     private string label; 
     public string Label { get { return label; } set { label = value; FirePropertyChanged(); } } 

     private string data; 
     public string Data { get { return data; } set { data = value; FirePropertyChanged(); } }   
    } 

}