代码之家  ›  专栏  ›  技术社区  ›  Sidebp

基于列表框选择更改ContentTemplate

  •  4
  • Sidebp  · 技术社区  · 15 年前

    <StackPanel Orientation="Horizontal">
          <ListBox>
              <ListBoxItem Content="People"/>
              <ListBoxItem Content="Animals"/>
              <ListBoxItem Content="Cars"/>
           </ListBox>
           <Border Width="200>
                <ContentPresenter/>
           </Border>
    </StackPanel>
    

    在列表框中选择项目时,我希望相应地更改ContentPresenter中的内容,例如,选择人员将更改模板以显示与人员相关的一系列输入字段,其中,选择动物将显示与动物相关的一系列字段等。-此行为类似于TabControl。

    有什么线索吗?

    谢谢

    1 回复  |  直到 15 年前
        1
  •  9
  •   Zamboni    15 年前

    您可以使用DataTrigger切换ContentTemplate,如下所示。
    注意,我用一个名为Name的属性将一个observateCollection绑定到一个简单的对象(事物),并使用ViewModel将ContentControl的内容绑定到列表框中的SelectedItem。

    <Grid>
        <Grid.Resources>
            <local:MultiValueConverter x:Key="con" />
    
            <DataTemplate x:Key="PeopleTemplate">
                <StackPanel Orientation="Horizontal">
                    <Label Margin="0,0,5,0" Content="People Name" HorizontalAlignment="Left" Grid.Column="0" />
                    <TextBox Grid.Column="1" Width="100" Height="25"></TextBox>
                    <Button Content="OK" Grid.Column="2" />
                </StackPanel>
            </DataTemplate>
    
            <DataTemplate x:Key="AnimalsTemplate">
                <StackPanel Orientation="Horizontal">
                    <Label Margin="0,0,5,0" Content="Animal Name" HorizontalAlignment="Left" Grid.Column="0" />
                    <TextBox Grid.Column="1" Width="100" Height="25"></TextBox>
                    <Button Content="OK" Grid.Column="2" />
                </StackPanel>
            </DataTemplate>
    
            <DataTemplate x:Key="CarsTemplate">
                <StackPanel Orientation="Horizontal">
                    <Label Margin="0,0,5,0" Content="Car Name" HorizontalAlignment="Left" Grid.Column="0" />
                    <TextBox Grid.Column="1" Width="100" Height="25"></TextBox>
                    <Button Content="OK" Grid.Column="2" />
                </StackPanel>
            </DataTemplate>
        </Grid.Resources>
    
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
    
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <ListBox ItemsSource="{Binding Things}" SelectedItem="{Binding SelectedThing}">
                <ListBox.ItemTemplate>
                  <DataTemplate>
                    <StackPanel Margin="0" Orientation="Horizontal">
                        <TextBlock Padding="5" Text="{Binding Name}" Margin="0"></TextBlock>
                    </StackPanel>
                  </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Border Width="200">
                <ContentControl Content="{Binding SelectedThing}">
                        <ContentControl.ContentTemplate>
                        <DataTemplate>
                            <ContentControl Name="cc" 
                              Content="{Binding}" 
                              ContentTemplate="{StaticResource PeopleTemplate}" />
                            <DataTemplate.Triggers>
                                <DataTrigger Binding="{Binding Path=Name}" Value="People">
                                    <Setter TargetName="cc"  
                                        Property="ContentTemplate" 
                                        Value="{StaticResource PeopleTemplate}" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Path=Name}" Value="Animals">
                                    <Setter TargetName="cc"  
                                        Property="ContentTemplate" 
                                        Value="{StaticResource AnimalsTemplate}" />
                                </DataTrigger>
                                <DataTrigger Binding="{Binding Path=Name}" Value="Cars">
                                    <Setter TargetName="cc"  
                                        Property="ContentTemplate" 
                                        Value="{StaticResource CarsTemplate}" />
                                </DataTrigger>
                            </DataTemplate.Triggers>
                        </DataTemplate>
                    </ContentControl.ContentTemplate>
                </ContentControl>
            </Border> 
        </StackPanel>        
    <Grid>
    

    这是事物类:

    public class Thing
    {
      public Thing(String name)
      {
         this.Name = name;
      }
    
      public String Name { get; set; }
    
      public static ObservableCollection<Thing> GetThingList()
      {
         return new ObservableCollection<Thing>(new Thing[3] {
                new Thing("People"), 
                new Thing("Animals"),
                new Thing("Cars")
            });
      }
    }