在WPF中动态添加按钮到表格排列

时间:2014-03-12 16:53:30

标签: wpf stackpanel

我想制作一个2列的表格,并在运行时向表格添加按钮。

我所做的是定义与此类似的嵌套StackPanel。

        <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 个答案:

答案 0 :(得分:1)

您可以使用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>

您也可以在.cs文件中为视图设置ItemsSource,否则使用ViewModel类来处理视图并创建一个ObservableCollection<MyItemWrapper>属性,该属性将保存所有表项。

视图模型:

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在运行时添加/删除项目,并使列表视图始终自动更新。

答案 1 :(得分:1)

我通过使用WrapPanel得到了它,我将分享我所做的,感谢Vlad的绑定部分:

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

答案 2 :(得分:0)

您提到动态地想要它,以及您不想使用StackPanel,因为最终会维护其中的widthheight控件。鉴于您希望控件自动调整其自身大小。

如果您真的想要进行2列表排列,最好的解决方案是使用Grid

看看这个example

示例代码

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