| Цитата(klein @ 21.4.2011, 13:34) | Ну какже не нужно ? Если логика програмы решает сколько добавлять контролов. В XAML насколько я знаю это какраз и не нужно делать. Про шаблоны я согласен. Неужели нужно создавать XAML "представление" контрола для добавление в listbox ? |
Почитай про MVVM патерн, посмотри примерчики. Найдешь ответы на все свои вопросы.
| Код | stackPanel1.Children.Add(UserControl);
|
- это ужасно. Уверен, что в твоем случае делать так крайне не рекомендуется. Чтобы не быть голословным, продемонстрирую простенький пример того, как можно сделать (это не MVVM). Пример кривой, шлефовать его времени нет, но смысл передан: Файл MainWindow.xaml
| Код | <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MyWindow" Height="350" Width="400" Name="MyWindow"> <DockPanel> <Button Content="Add new item" DockPanel.Dock="Bottom" HorizontalAlignment="Left" Margin="5" Click="Button_Click" /> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <ListView DataContext="{Binding ., ElementName=MyWindow}" ItemsSource="{Binding MyItems}" HorizontalContentAlignment="Stretch"> <ListView.ItemTemplate> <DataTemplate> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.3*"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Name}" Grid.Column="0"/> <TextBox Text="{Binding Description, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1"/> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> <ListBox DataContext="{Binding ., ElementName=MyWindow}" ItemsSource="{Binding MyItems}" HorizontalContentAlignment="Stretch" Grid.Column="1"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Имя: "/> <TextBlock Text="{Binding Name}"/> </StackPanel> <StackPanel Orientation="Horizontal"> <TextBlock Text="Описание: "/> <TextBox Text="{Binding Description, UpdateSourceTrigger=PropertyChanged}"/> </StackPanel> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </DockPanel> </Window>
|
Файл MainWindow.xaml.cs
| Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; 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; using System.Collections.ObjectModel; using System.ComponentModel;
namespace WpfApplication1 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); MyItems.Add(new MyData("item1", "description1")); MyItems.Add(new MyData("item2", "description2")); MyItems.Add(new MyData("item3", "description3")); }
ObservableCollection<MyData> myItems = new ObservableCollection<MyData>();
/// <summary> /// Список данных /// </summary> public ObservableCollection<MyData> MyItems { get { return myItems; } }
private void Button_Click(object sender, RoutedEventArgs e) { MyItems.Add(new MyData("new item", "new item description")); } }
/// <summary> /// Класс данных /// </summary> public class MyData : INotifyPropertyChanged { public MyData(string name, string description) { if (string.IsNullOrEmpty(name)) throw new ArgumentException("Name must be not empty!"); Name = name; Description = description; }
private string name = string.Empty;
public string Name { get { return name; } private set { name = value; OnPropertyChanged("Name"); } }
private string description = string.Empty;
public string Description { get { return description; } set { description = value; OnPropertyChanged("Description"); } }
#region INotifyPropertyChanged
/// <summary> /// Событие на изменение свойства /// </summary> public event PropertyChangedEventHandler PropertyChanged;
/// <summary> /// Уведомление об изменении свойства (все объекты представления привязаные к этому свойству автоматически обновят себя) /// </summary> /// <param name="propertyName">Имя свойства принимающего новое значение</param> protected virtual void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) { this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } #endregion } }
|
Добавлено через 2 минуты и 32 секунды На будущее. Старайся избегать создания и изменения визуальных элементов в коде. Это может быть оправдано в очень редких случаях. |