【问题标题】:How to bind data to a ListBox in a ControlTemplate?如何将数据绑定到 ControlTemplate 中的 ListBox?
【发布时间】:2010-09-21 08:31:41
【问题描述】:

我想做的是创建某种“房间”(如聊天组、共享中心或任何你想要的)。所有房间都以相同的方式创建,但每个房间都包含不同的信息。这些房间中的每一个都包含在一个 TabItem 中。我设法动态地创建了所有的 Tabitems,给它们一个 Grid 和一个 Canvas。但目前我面临一个问题:我创建了一个名为 RoomMenu 的 ControlTemplate,它将显示不同的按钮,最重要的是,在 ListBox 中连接到这个房间的人(我每次更改所选内容时都会从 WebService 检索这些人表项)。但由于我的 ListBox 在 ControlTemplate 中,我不知道如何访问 ListBox ItemSource 以将通用 List 绑定到它。下面是用于创建我的房间及其内容的代码。

这是我的房间菜单类:

public class RoomMenu : ContentControl
{
    public RoomMenu()
    {
        DefaultStyleKey = typeof(RoomMenu);
    }

    public string Current_room_id;
    public string FullName;
    public string Rights;
}

这是位于 generic.xaml 中的 ControlTemplate:

    <Style TargetType="test:RoomMenu">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="test:RoomMenu">
                <Grid x:Name="MenuGrid">
                    <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Black" CornerRadius="2" Background="Black">
                        <StackPanel Orientation="Vertical">
                            <Border x:Name="Room_friend_border" Background="Gray" CornerRadius="4" Margin="5">
                                <ListBox x:Name="current_room_friends" ItemsSource="{Binding ''}" Margin="5" Height="230">
                                    <ListBox.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding FullName}" Height="20"/>
                                                <TextBlock Text="{Binding Rights}" Height="20"/>
                                            </StackPanel>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>
                                </ListBox>
                            </Border>
                            <Border x:Name="Room_menu" Background="Gray" CornerRadius="4" Margin="5">
                                <StackPanel Orientation="Vertical" Margin="10">
                                    <Button Content="Add item" Margin="0,2,0,2"/>
                                    <Button Content="Set changes" Margin="0,2,0,2"/>
                                    <Button Content="Invite friend" Margin="0,2,0,2"/>
                                    <Button Content="Rename room" Margin="0,2,0,2"/>
                                    <Button Content="Delete room" Margin="0,2,0,2"/>
                                </StackPanel>
                            </Border>
                        </StackPanel>
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是包含 RoomMenu 的字典类:

public class Rooms : TabItem
{
    public string Room_guid;
    public string Room_name;
    public string Primary_user_guid;
    public string Room_version;

    public Grid Room_grid;
    public Canvas Room_canvas;
    public RoomMenu Room_menu;
}

这是当我调用我的 ControlTemplate 并将它添加到我的 TabItem 的网格时:

    public void Set_rooms_interface()
    {
        foreach (KeyValuePair<string, Rooms> kvp in rooms_list)
        {
            rooms_list[kvp.Key].Room_menu = new RoomMenu();
            rooms_list[kvp.Key].Room_canvas = new Canvas();
            rooms_list[kvp.Key].Room_grid = new Grid();

            //instance grid columns
            rooms_list[kvp.Key].Room_grid.ColumnDefinitions.Add(new ColumnDefinition() {Width = new GridLength(900)});
            rooms_list[kvp.Key].Room_grid.ColumnDefinitions.Add(new ColumnDefinition());

            //Refreshing room canvas
            rooms_list[kvp.Key].Room_canvas.Height = rooms_list[kvp.Key].Room_grid.ActualHeight;
            rooms_list[kvp.Key].Room_canvas.Width = rooms_list[kvp.Key].Room_grid.ActualWidth;
            rooms_list[kvp.Key].Room_canvas = refresh_canvas(kvp.Key);
            Grid.SetColumn(rooms_list[kvp.Key].Room_canvas, 0);
            Grid.SetColumn(rooms_list[kvp.Key].Room_menu, 1);

            //Add Canvas to Grid
            rooms_list[kvp.Key].Room_grid.Children.Add(rooms_list[kvp.Key].Room_canvas);
            rooms_list[kvp.Key].Room_grid.Children.Add(rooms_list[kvp.Key].Room_menu);
            //Setting TabItem Name
            rooms_list[kvp.Key].Header = rooms_list[kvp.Key].Room_name;
            //Adding Grid to TabItem.Content
            rooms_list[kvp.Key].Content = rooms_list[kvp.Key].Room_grid;
            //Adding TabItem to TabControl
            Room_tab.Items.Add(kvp.Value);
        }
    }

如果整个问题有点长,我很抱歉,但这是清楚解释我想要做什么的唯一方法。因此,如果有人能给我一个提示或答案,让我在 ControlTemplate 中进行一些数据绑定,那将对我有很大帮助。

谢谢。

【问题讨论】:

    标签: c# data-binding silverlight-4.0 controltemplate


    【解决方案1】:

    我认为在代码中实例化 UI 元素时,您的出发点是错误的。后面的代码应该只包含将人员列表分配给 current_room_friends DataContext 的一行。

    从将数据绑定到 ListBox 的更简单示例开始,例如 Bea Stollnitz 的 beautiful planet example

    【讨论】:

    • 我想我会按照你说的做,尽管与我计划做的相比有点局限。
    猜你喜欢
    • 2014-09-28
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多