我正在寻找一种在Silverlight中一次显示一个项目的好方法,而不显示用于选择项目的UI。这就像没有选项卡的TabControl,或没有下拉列表的组合框。
现在我们正在使用一个TabControl样式来隐藏标签,但这感觉就像一个黑客。在Silverlight中有更自然的方法吗?
以下是我正在寻找的功能:
我尝试过使用绑定到所选项目的ContentPresenter:
<ContentPresenter Content="{Binding SelectedItem}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<MyUserControl />
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
但是这似乎使用了MyUserControl的单个实例,当SelectedItem更改时,将相同的实例重新绑定到不同的视图模型。这意味着每个所选项目不会单独跟踪诸如是否展开树节点之类的状态。
有更好的方法吗?
感谢您的帮助,
理查德
答案 0 :(得分:2)
最好的方法是做一些工作:
您创建了一个扩展System.Windows.Controls.Primitives.Selector的类,它是具有以下内容的对象的基类:
将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分钟。