动态创建按钮网格并绑定其文本值

本文关键字:文本 绑定 创建 按钮 网格 动态 | 更新日期: 2023-09-27 17:50:14

我实际上有两个问题。

我正在WPF(连接到asp.net webservice)中的电影项目上工作。在视图上,我必须显示一场演出的所有预订,为此,我需要在视图上显示类似网格的东西,以显示一个房间中的所有座位(显示哪个座位是空闲的/预订的/已售出的)。

首先,网格只有一个按钮(在菜单中),它绑定到一个命令(LoadReservationCommand)来加载所有数据。在此之前,视图模型不知道网格的大小,因此应该动态创建它。这可能吗?

一旦我有了网格(例如buttongrid),我应该将其文本值绑定到来自视图模型的字符串数组(free、reserved、sold)的数组。有没有办法用索引来绑定它?

这是我的ViewModel构造函数的第一部分。

谢谢你的帮助!

public ReservationViewModel(IMoziAdminModel model, PerformanceDTO performance)
    {
        _model = model;
        _performance = performance;
        LoadReservationCommand = new DelegateCommand(async (param) =>
        {
            //We need to find in which room the performance will be
            try
            {
                await _model.RoomLoadAsync();
                Rooms = new ObservableCollection<RoomDTO>(_model.Rooms);
            }
            catch
            {
                OnMessageApplication("Error (Loading)");
            }
            foreach (var r in Rooms)
            {
                if (r.Room_Id == _performance.Room_Id)
                {
                    row = r.Rows;
                    column= r.Columns;
                }
            } //And now we know how big the room is, and we could create the buttongrid.
            ......
        });
        .......
    }

动态创建按钮网格并绑定其文本值

"字符串数组的数组" ?来吧!

enum SeatState {
    Free,
    // ...
}
class Seat {
    ICommand Buy { get; private set; }
    SeatState State { get; private set; }
    // ...
}
class Room {
    int Rows { get; private set; }
    int Colums { get; private set; }
    IEnumerable<Seat> Seats { get; private set; }
    // ...
}
class ViewModel : BaseClassImplementingINotifyPropertyChange {
    Room CurrentRoom {
        get { ... }
        private set { ... } // Raise event
    }
    ICommand LoadCurrentRoom { get; private set; }
}

view

<...>
    <ItemsControl ItemsSource="{Binding CurrentRoom.Seats}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid
                    Columns="{Binding CurrentRoom.Columns}"
                    Rows="{Binding CurrentRoom.Rows}"
                />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Command="{Binding Buy}">
                    <TextBlock Text="{Binding State}"/>
                </Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</...>

您可以将这些按钮添加到视图模型的集合中,然后将其绑定到ListView, ListView将根据您指定的模板生成按钮。