Silverlight ItemsControl一次显示一个项目?

时间:2011-07-19 05:11:24

标签: .net silverlight xaml data-binding itemscontrol

我正在寻找一种在Silverlight中一次显示一个项目的好方法,而不显示用于选择项目的UI。这就像没有选项卡的TabControl,或没有下拉列表的组合框。

现在我们正在使用一个TabControl样式来隐藏标签,但这感觉就像一个黑客。在Silverlight中有更自然的方法吗?

以下是我正在寻找的功能:

  • 仅显示所选项目。
  • 不显示用于选择项目的UI。 (选择将根据应用UI的不同部分中的用户操作进行更改。)
  • 数据绑定到一组视图模型。
  • 使用DataTemplate显示每个视图模型的视图。
  • 保留每个所选项目的视图状态。 (例如,假设在我们的一次性项目控件中,我们显示所选项目的选项树。我希望为每个项目单独跟踪树节点的展开/折叠状态。)

我尝试过使用绑定到所选项目的ContentPresenter:

<ContentPresenter Content="{Binding SelectedItem}">
  <ContentPresenter.ContentTemplate>
    <DataTemplate>
      <MyUserControl />
    </DataTemplate>
  </ContentPresenter.ContentTemplate>
</ContentPresenter>

但是这似乎使用了MyUserControl的单个实例,当SelectedItem更改时,将相同的实例重新绑定到不同的视图模型。这意味着每个所选项目不会单独跟踪诸如是否展开树节点之类的状态。


有更好的方法吗?

感谢您的帮助,
理查德

3 个答案:

答案 0 :(得分:2)

最好的方法是做一些工作:

您创建了一个扩展System.Windows.Controls.Primitives.Selector的类,它是具有以下内容的对象的基类:

  • 绑定到
  • 的集合
  • selectedItem

将Grid设置为ItemsPanel,将ItemTemplate设置为填充整个网格的DataTemplate,但默认隐藏(或不透明)。 IsSelected属性上的DataTemplate中的触发器隐藏/显示Item。

只有一种可能性

答案 1 :(得分:1)

您是否有必要访问控件本身的SelectedItem属性?如果您可以移动处理所选项目的逻辑(例如取消选择,返回选择哪个项目等)到视图模型,您可以使用带有Grid作为ItemsPanel的ItemsControl。然后在ItemTemplate中你可以放置MyUserControl。 MyUserControl将其Visibility属性绑定到数据项上的属性,中间包含转换器。然后,您将在数据项而不是UI控件上将IsSelected设置为true,并且将显示相应的MyUserControl实例。

答案 2 :(得分:1)

这很简单。

第一步是使用ListBox,提供datatemplate,viewmodel集合并绑定所选项目,就像你现在一样。

您想要的步骤(隐藏所有未选择的项目)仅需要您创建ItemContainerStyle。这个样式有一个你想要注意的VisualStateGroup,有两个状态“Selected”和“Unselected”。在Unselected状态下,您希望将LayoutRoot设置为折叠,并在Selected中设置您希望LayoutRoot可见。

如果你有混合,这将花费你大约15分钟。