在UI上的某个“插槽”处动态交换UIElement
的最小方法是什么?我有一些UIElement
s并基于一些外部数据绑定(例如组合框选择)我想要显示其中一个,并且当前可见的一个被隐藏。所以行为有点像TabControl
但没有制表符,chrome和tabitem实例。所以我实际上可以使用TabControl
并覆盖控件模板。但这真的是最小的方法吗?
答案 0 :(得分:2)
<ContentControl Content="{Binding SomePropertyThatYieldsTheContent}"/>
答案 1 :(得分:1)
我不知道这是否是最简洁的方式,但如果您使用的是DataTemplate
,则可以使用DataTrigger
s(此处的假设是初始可见性为{{1} }}):
Collapsed
答案 2 :(得分:1)
您有几种选择。正如布莱恩所说,Data Template Selectors绝对可以奏效,虽然我已经认定他们经常矫枉过正。举个例子 - 如果你想将元素的可见性绑定到ComboBox
中的选择,我宁愿选择ValueConverter
。将ComboBox.SelectedItem
传递给Converter
并让其返回“可见性”值:
public class MyObjectToVisibleOrCollapsed : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is MyObject)
{
var myObject = (MyObject)value;
if (myObject.SomeState)
{
return Visibility.Visible;
}
}
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
现在在您的Window.Resources中,创建ValueConverter
的实例,并使用ComboBox.SelectedItem
实例将元素绑定到ValueConverter
:
<local:MyObjectToVisibleOrCollapsed x:Key="myObjectToVisibleOrCollapsed"/>
<DataTemplate x:Key="MyTemplate">
<TextBlock Text="{Binding Path=myText}"
x:Name="MyText"
Visibility="{Binding ElementName=MyComboBox, Path=SelectedItem, Converter={StaticResource myObjectToVisibleOrCollapsed}, Mode=Default}" />
</DataTemplate>
当然,您可以将ValueConverter
重用于DataTemplate
中的所有元素(如果有很多元素,那么数据模板选择器方法就更合适了。)
[免责声明:上面的代码是从内存中删除而未经过测试 - 可能需要稍微调整一下]
答案 3 :(得分:0)
调查Data Template Selectors,Bea Stollnitz发表了一篇好文章here。基本上,您将在每个UI“插槽”中使用ContentPresenter
,然后使用ContentTemplateSelector
属性来定义您将使用的模板选择器。
答案 4 :(得分:0)
我为每个可能的“视图”创建自定义用户控件。
使用c#改变他们的可见度。需要很少的编码。
这种方法的主要原因是易于开发 - 设计师专注于特定的视图,而不是那些将存在的所有可能控件的集合。
答案 5 :(得分:-1)
我这样做的方法是将元素叠加在一起,并以编程方式将Visibility属性从Visible更改为Collapsed,然后根据需要再次返回。