Динамически добавлять кнопки в расположение таблиц в WPF
Я хотел бы составить таблицу с двумя столбцами и добавить кнопки к таблице во время выполнения.
что я сделал, так это определил вложенные StackPanels.
<StackPanel MinWidth="500" MaxWidth="800" MaxHeight="400" HorizontalAlignment="Center">
<TextBlock HorizontalAlignment="Center" Foreground="Black" Margin="0,0,0,5" FontSize="20">Some Title</TextBlock>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="" MinWidth="100" MinHeight="100" Margin="10,0,0,10"></Button>
<Button Content="" MinWidth="100" MinHeight="100" Margin="10,0,0,10"></Button>
</StackPanel>
</StackPanel>
Это правильный старт, или есть лучшая и более простая договоренность?
3 ответа
Вы можете использовать реализацию представления модели с ListView и связать ее с коллекцией элементов, имеющих соответствующий обработчик для кнопки:
WPF:
<ListView ItemsSource={Binding MyItems}>
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding={Binding Name}></GridViewColumn>
<GridViewColumn Header="Button">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Command={Binding ButtonPress}>Click me</Button>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Вы также можете установить ItemsSource внутри файла.cs для вашего представления, в противном случае используйте класс ViewModel для обработки вашего представления и создания ObservableCollection<MyItemWrapper>
свойство, которое будет содержать все элементы таблицы.
ViewModel:
public class MyViewModel
{
private ObservableCollection<MyItemWrapper> _myItems;
public MyViewModel()
{
_myItems = new ObservableCollection<MyItemWrapper>();
//// add your initial items
}
public ObservableCollection<MyItemWrapper> MyItems
{
get { return _myItems; }
}
}
Посмотреть:
public partial class MyView : UserControl
{
public MyView(MyViewModel viewModel)
{
DataContext = viewModel;
InitializeComponents()
}
}
MyItem и MyItemWrapper
public class MyItem
{
public string Name { get; set; }
public object Data { get; set; }
}
public class MyItemWrapper
{
private MyItem _item;
public MyItemWrapper(MyItem item)
{
_item = item;
ButtonPress = new DelegateCommand<object>(OnButtonPress);
}
public string Name
{
get { return _item.Name; }
}
public DelegateCommand<object> ButtonPress { get; private set; }
private void OnButtonPress(object args)
{
System.Diagnostics.Debug.WriteLine("Button pressed for: " + Name);
}
}
Это в конечном итоге позволит добавлять / удалять элементы во время выполнения, используя MyItems внутри модели представления, и ваш список всегда будет обновляться автоматически.
Я получил его с помощью WrapPanel, и я поделюсь тем, что я сделал, Спасибо за Влада за обязательную часть:
<ListBox ItemsSource="{Binding CartItemC.CartItems}" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel x:Name="wrapPanel" MaxWidth="300" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<WrapPanel MaxWidth="300">
<Button Command="{Binding ButtonPress}">Click me</Button>
</WrapPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Вы упомянули, что хотите динамически, ну, вы не хотите использовать StackPanel
как вы в конечном итоге поддерживает width
а также height
элементов управления внутри него. Если вы хотите, чтобы элементы управления автоматически изменяли свой размер.
Лучшее решение - использовать Grid
если вы действительно хотите составить таблицу с двумя столбцами.
Посмотрите на этот пример.
Образец кода
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="28" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="200" />
</Grid.ColumnDefinitions>