2010-06-14 49 views
1

绑定我有一个WPF UI绑定到的AwesomeClass绑定在使用模板(WPF)

集合现在,AwesomeClass有AwesomeParts对象的集合。

如何我可以让我的用户界面在这样的方式(作为一个例子)
每个AwesomeClass例如,有一个标签一个标签面板 ,然后在每个真棒部分上,对一个对象一个列表框,在该选项卡上。

基本上:Awesomes->标签

并且然后:Awesome.Awesomeparts-> Tabs.Listbox

回答

2

以下是代码做你在找什么:

public partial class TabWindow : Window 
{ 
    public TabWindow() 
    { 
     InitializeComponent(); 

     List<AwesomeClass> items = new List<AwesomeClass>(); 

     for (int i = 0; i < 10; i++) 
     { 
      items.Add(new AwesomeClass()); 
     } 

     AwesomeTabs.ItemsSource = items; 

     Loaded += new RoutedEventHandler(TabWindow_Loaded); 
    } 

    // Method 1 
    void TabWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     FindListBox(AwesomeTabs); 
    } 

    private void FindListBox(DependencyObject obj) 
    { 
     Int32 count = VisualTreeHelper.GetChildrenCount(obj); 
     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(obj, i); 
      if (child is ListBox) 
      { 
       (child as ListBox).SelectionChanged += new SelectionChangedEventHandler(ListBox_SelectionChanged); 
      } 
      else 
      { 
       FindListBox(child); 
      } 
     } 
    } 

    // Method 2 
    private void ListBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     (sender as ListBox).SelectionChanged += new SelectionChangedEventHandler(ListBox_SelectionChanged); 
    } 

    void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     try 
     { 
      MessageBox.Show(e.AddedItems[0].ToString()); 
     } 
     catch (Exception) 
     { } 
    } 
} 

class AwesomeClass 
{ 
    static Int32 count = 0; 

    public Int32 Index { get; set; } 

    public List<AwesomePart> Parts { get; protected set; } 

    // Method 3 : Preferred 
    private AwesomePart _selectedPart; 
    public AwesomePart SelectedPart 
    { 
     get { return _selectedPart; } 
     set 
     { 
      OnSelectionChanged(_selectedPart, value); 
      _selectedPart = value; 
     } 
    } 

    private void OnSelectionChanged(AwesomePart oldValue, AwesomePart newValue) 
    { 
     if (newValue != null) MessageBox.Show(newValue.ToString()); 
    } 

    public AwesomeClass() 
    { 
     Index = ++count; 

     Parts = new List<AwesomePart>(); 

     for (int i = 0; i < 10; i++) 
     { 
      Parts.Add(new AwesomePart()); 
     } 
    } 

    public override string ToString() 
    { 
     return "Tab #" + Index.ToString(); 
    } 
} 

class AwesomePart 
{ 
    static Int32 count = 0; 

    public Int32 Index { get; set; } 

    public AwesomePart() 
    { 
     Index = ++count; 
    } 

    public override string ToString() 
    { 
     return "Part #" + Index.ToString(); 
    } 
} 

XAML:

<Grid> 
    <TabControl Name="AwesomeTabs"> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <ListBox ItemsSource="{Binding Parts}" SelectedItem="{Binding SelectedPart}" Loaded="ListBox_Loaded"></ListBox> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 
+0

唯一的一点是,如果我想打电话列表框的选择值的函数,我将如何参考它? – akshaykarthik 2010-06-14 20:24:41

+0

@AKRamkumar:将AwesomeClass中的属性绑定到Listbox的SelectedItem属性。从该属性的setter调用该函数。 – Amsakanna 2010-06-15 07:58:47

+0

更新了代码! – decyclone 2010-06-15 09:22:09

0

绑定列表<AwesomeClass>到带标题内容的控制。每个“AwesomeClass”对象将设置为headered内容控件中每个“选项卡”的datacontext。

在每个“选项卡”上的内容控件中,将访问列表<AwesomePart>的DataContext(AwesomeClass)属性绑定到您的Listbox控件。

有意义吗?

干杯。