根据列表框选择更改 ContentTemplate

发布于 2024-09-27 17:31:15 字数 648 浏览 2 评论 0原文

我在 StackPanel 中有一个列表框和一个边框,类似于以下内容:

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

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

我认为我可以使用 DataTrigger 来实现此目的,该 DataTrigger 会更改边框中的 DataTemplate,但我不确定如何实现此目的。

有什么指点吗?

谢谢

I have a Listbox and a Border in a StackPanel similar to the following:

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

When selecting an item in the listbox I would like to change the content in the ContentPresenter accordingly e.g. selecting People would change the template to display a series of input fields related to people where as selecting Animals would display a series of fields related to Animals etc. - the behavior of this would be akin to a TabControl.

I think I can achieve this with a DataTrigger which changes the DataTemplate in the Border but I'm not sure how to achieve this.

Any pointers?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落墨 2024-10-04 17:31:15

您可以使用 DataTrigger 切换 ContentTemplate,如下所示。
请注意,我将 ObservableCollection 绑定到一个具有名为 Name 的属性的简单对象 (Thing),并且我是否使用 ViewModel 将 ContentControl 的内容绑定到 ListBox 中的 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>

这是 Thing 类:

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")
        });
  }
}

You can toggle the ContentTemplate using a DataTrigger as follows.
Note, that I am binding an ObservableCollection to a simple object (Thing) with one property called Name, and am I binding the Content of the ContentControl to the SelectedItem in the ListBox using a ViewModel.

<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>

Here is the Thing class:

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")
        });
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文