2012-04-12 176 views
1

我有一个TreeView的节点,所以当我点击其中一个节点时,我将更新列表框的项目绑定到一个Observable集合,这很好。接下来,当我点击树视图中的另一个节点时,我将不得不用不同的数据更新列表框(这也是一个Obsv.Collection)。任何想法如何进行这个?更新列表框项目

<Resources> 
    <DataTemplate x:Key="clipsource"> 
     <StackPanel> 
      <Image Name="img" Width="125" Height="70" Margin="1,0" Source="{Binding Path=Path, Converter= {x:Static l:UriToThumbnailConverter.Instance}}"/> 
      <TextBlock FlowDirection="LeftToRight" FontFamily="Arial" FontSize="12" Text="{Binding Path = DisplayClipName}"/> 
     </StackPanel> 
    </DataTemplate> 
</Resources> 
<Grid Height="Auto" Grid.Column="2" VerticalAlignment="Stretch" x:Name="RightPane_grid" Margin="2,0,0,0" KeyboardNavigation.DirectionalNavigation="None"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="21.205"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Rectangle Fill="#FF232323" Stroke="#FF000000" RadiusX="3" RadiusY="3" Margin="0,0,0,0" x:Name="Right_Pane_bkg" Grid.ColumnSpan="1" Grid.RowSpan="2" KeyboardNavigation.DirectionalNavigation="None"/> 
    <ListBox Name="ListBox1" SelectionMode="Extended" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" Grid.Row="0" Background="#FF3B3B3B" Margin="2,25,2,2" ItemsSource="{Binding}" ItemTemplate="{StaticResource clipsource}"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 
</Grid> 

代码背后:

private void Handle_Click1(object sender, MouseButtonEventArgs e) // tree view Item 
{ 
    ListBox1.DataContext = Clips Items; 
    // Clips Items is an Obs v. Collection 
} 

我有另一个观测值ν,其我必须将它绑定到列表框中显示另一种观点认为

+0

我看到你正在试图粘贴XAML注释。你可以编辑你的问题。把那里 – 2012-04-12 20:26:15

+1

你可以显示在第一个节点上点击列表框的代码吗? – Steve 2012-04-12 20:27:54

+0

基本思路:将ListBox.ItemsSource绑定到TreeView的SelectedItem属性。 – 2012-04-12 20:41:57

回答

0

你可以试试下面的收藏尚品:

<TreeView Name="MyTreeView"> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="Header" Value="{Binding Path=Name}"/> 
       <Setter Property="ItemsSource" Value="{Binding Path=SomeItems}"/> 
      </Style> 
     </TreeView.ItemContainerStyle> 
    </TreeView> 

    <ListBox ItemsSource="{Binding ElementName=MyTreeView, Path=SelectedItem.SomeItems}"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Content" Value="{Binding Path=Name}"/> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 

绑定将从SelectedItem中检索显示在列表框中的项目在TreeView中使用Path SomeItems。这假设SelectedItem是这样的:

public class MyTreeViewItem 
{ 

    public string Name { get; private set; } 
    public ObservableCollection<MyTreeViewItem> SomeItems { get; private set; } 

    public MyTreeViewItem(string name) 
    { 
     if (name == null) 
      throw new ArgumentNullException("name"); 

     this.SomeItems = new ObservableCollection<MyTreeViewItem>(); 
     this.Name = name; 
    } 

} 

当您在TreeView中选择一个项目时,子项显示在列表框中。

编辑:

要填充TreeView控件使用下面的代码:

 MyTreeViewItem a = new MyTreeViewItem("A"); 
     a.SomeItems.Add(new MyTreeViewItem("A1")); 
     a.SomeItems.Add(new MyTreeViewItem("A2")); 
     a.SomeItems.Add(new MyTreeViewItem("A3")); 

     MyTreeViewItem b = new MyTreeViewItem("B"); 
     b.SomeItems.Add(new MyTreeViewItem("B1")); 
     b.SomeItems.Add(new MyTreeViewItem("B2")); 
     b.SomeItems.Add(new MyTreeViewItem("B3")); 

     this.MyTreeView.ItemsSource = new MyTreeViewItem[] { a, b };