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

时间:2015-05-21 14:23:17

标签: c# wpf mvvm

我实际上有两个问题。

我正在使用WPF中的Cinema项目(连接到asp.net webservice)。在一个视图中,我必须显示一个表演的所有预订,为此我需要在我的视图中显示一个网格,以显示一个房间中的所有座位(以显示哪个座位是免费/保留/出售的)。

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

一旦我有了网格(例如buttongrid),我应该将它的文本值绑定到一个字符串数组(free,reserved,sold),它来自viewmodel。有没有办法以某种方式将其与索引绑定?

这是我的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.

            ......

        });

        .......

    }

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

&#34;一串字符串数组&#34; ? C&#39;星期一!比那更多OO!

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

然后是视图

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