Wciąż wspinam się na strome wzgórze WPF! Dlatego chcę utworzyć interfejs użytkownika, który pozwala użytkownikowi dynamicznie dodawać pole tekstowe. W tym celu nacisnęli przycisk.Dynamiczne dodawanie TextBox za pomocą przycisku w ramach MVVM
Udało mi się utworzyć to za pomocą kodu, ale chcę przejść do struktury MVVM, więc nie mam żadnego kodu w widoku. Próbowałem ICommand i ObservableCollection, ale brakuje mi czegoś i nie wiem gdzie. Oto mój prosty przykład.
XAML: Bardzo prosty z jednym przyciskiem dodającym wiersz.
<Window x:Class="WPFpractice072514.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFpractice072514"
Title="MainWindow" Height="350" Width="525">
<Grid Name="mymy" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Grid.Row="0" Name="ButtonUpdateArtist"
Content="Add TextBox" Click="ButtonAddTexboxBlockExecute" />
</Grid>
</Window>
C# Code Behind
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WPFpractice072514
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
#region members
int count = 0;
#endregion
public MainWindow()
{
InitializeComponent();
}
private void ButtonAddTexboxBlockExecute(Object Sender, RoutedEventArgs e)
{
TextBox t = new TextBox();
t.Height = 20;
t.Width = 20;
t.Name = "button";
RowDefinition rowDef1;
rowDef1 = new RowDefinition();
mymy.RowDefinitions.Add(rowDef1);
ColumnDefinition colDef1;
colDef1 = new ColumnDefinition();
mymy.ColumnDefinitions.Add(colDef1);
++count;
mymy.Children.Add(t);
Grid.SetColumn(t, 1);
Grid.SetRow(t, count);
}
}
}
pytania: Jaki kod (XAML i C#) muszę być w stanie poruszać się metodę z kodem tyłu i do viewmodel?
Czy można użyć poleceń do dynamicznego dodawania pola tekstowego?
Zakładam, że pola tekstowe muszą być przechowywane w kontenerze, w którym to przypadku jest siatka. Ale jeśli używam MVVM, czy muszę zawierać pola tekstowe w widoku listy lub innym kontenerze używającym ItemsSource?
To nie jest MVVM, z powodu którego prawdopodobnie walczysz. W MVVM, miałbym ViewModel z publicznie obserwowalną właściwością kolekcji modeli związanych z ItemsControl. Posiadałbym DataTemplate dla typu modelu. I będę miał ICommand powiązane z przyciskiem. Po kliknięciu przycisku polecenie uruchamia się w modelu widoku, do którego dodaję nowy model do kolekcji. Interfejs użytkownika automatycznie doda interfejs użytkownika dla elementu za pomocą DataTemplate. Właśnie dlatego robimy MVVM - to proste. To, co robisz, to formularze systemu Windows.Jeśli chcesz tworzyć formularze, zrób to. – Will