Как привязать данные к ListBox в ControlTemplate? - PullRequest
1 голос
/ 21 сентября 2010

То, что я пытаюсь сделать, - это создать некие «комнаты» (например, чат-группу, центр обмена или все, что вы хотите). Все комнаты созданы одинаково, но каждая из них содержит различную информацию. Каждая из этих комнат содержится в TabItem. Мне удалось динамически создать все табитемы, дать им сетку и холст. Но в данный момент я сталкиваюсь с проблемой: я создал ControlTemplate Called RoomMenu, который будет отображать разные кнопки и, что наиболее важно, людей, подключенных к этой комнате, в ListBox (я получаю этих людей из WebService каждый раз, когда меняю выбранное TabItem). Но так как мой 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;
}

А вот ControlTemplate, расположенный в generic.xaml:

    <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, это очень помогло бы мне.

Спасибо.

1 Ответ

1 голос
/ 21 сентября 2010

Я думаю, что вы начали в неправильном направлении при создании элементов пользовательского интерфейса в коде. Код должен содержать только одну строку, присваивающую список людей для DataContext current_room_friends.

Начните с более простых примеров привязки данных к ListBox, таких как пример прекрасной планеты Беа Штольниц.

...