2010-09-21 68 views
1

我想要做的是創建某種「房間」(如聊天組,共享中心或任何你想要的)。所有的房間都以同樣的方式創建,但每個房間都包含不同的信息。每個房間都包含在一個TabItem中。我設法動態地創建了所有的Tabitems,給出了一個Grid和一個Canvas。但目前我面臨一個問題:我創建了一個名爲RoomMenu的ControlTemplate,它將顯示不同的按鈕,並且最重要的是,這個房間中的人連接到一個ListBox中(每次更改所選內容時,我都會從WebService中檢索這些人TabItem的)。但是因爲我的ListBox在ControlTemplate中,所以我不知道如何訪問ListBox ItemSource來將一個通用List綁定到它。向下以下是用於創建我的房間及其內容的代碼。如何將數據綁定到ControlTemplate中的ListBox?

這裏是我的房間菜單類:

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

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

而且這裏地處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> 

這裏是我的Dictionnary類包含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

我認爲你在代碼中實例化UI元素時開始的方向是錯誤的。後面的代碼應該只包含一行,將人員列表分配給current_room_friends DataContext。

從更簡單的例子,將數據綁定到ListBox,比如Bea Stollnitz的beautiful planet example

+0

我想我會按照你說的方式去做,儘管與我打算做的事情相比,它有點有限。 – Aymeric 2010-09-22 08:39:19

相關問題