UIElement
在 UI 上的某个“插槽”动态交换 s 的最简单方法是什么?我有许多UIElement
s 并且基于一些外部数据绑定(例如组合框选择),我希望显示其中一个,而隐藏当前可见的一个。所以行为有点像,TabControl
但没有 tabstrip、chrome 和 tabitem 实例。所以我实际上可以使用TabControl
并覆盖控制模板。但这真的是最小的方法吗?
6 回答
<ContentControl Content="{Binding SomePropertyThatYieldsTheContent}"/>
我不知道这是否是最简洁的方式,但如果你使用 a DataTemplate
,你可以使用DataTrigger
s (这里的假设是初始可见性是Collapsed
):
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=SourceProperty.ValueType}">
<DataTrigger.Value>
<pm:ValueType>Text</pm:ValueType>
</DataTrigger.Value>
<Setter TargetName="TextEditor" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=SourceProperty.ValueType}">
<DataTrigger.Value>
<pm:ValueType>Logical</pm:ValueType>
</DataTrigger.Value>
<Setter TargetName="LogicalEditor" Property="Visibility" Value="Visible" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=SourceProperty.ValueType}">
<DataTrigger.Value>
<pm:ValueType>DateTime</pm:ValueType>
</DataTrigger.Value>
<Setter TargetName="DateEditor" Property="Visibility" Value="Visible" />
</DataTrigger>
...
你有几个选择。正如 Bryan 提到的,数据模板选择器绝对可以工作,尽管我认为它们经常是矫枉过正的。以您的示例为例-如果您想将元素的可见性绑定到 a 中的选择ComboBox
,我更喜欢 a 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
(如果它们很多,那么数据模板选择器方法变得更可取)。
[免责声明:上面的代码是从内存中散列出来的,没有经过测试——可能需要稍微调整一下]
查看数据模板选择器,Bea Stollnitz在这里有一篇很好的文章。基本上,您将ContentPresenter
在每个 UI“插槽”中使用 a,然后使用该ContentTemplateSelector
属性来定义您将使用的模板选择器。
我为每个可能的“视图”创建自定义用户控件。
它们的可见性是使用 c# 更改的,你。需要很少的编码。
这种方法的主要原因是易于开发——设计者关注特定的视图,而不是所有可能存在的控件集。
我这样做的方法是将元素相互叠加,并以编程方式将它们的 Visibility 属性从 Visible 更改为 Collapsed 并根据需要再次返回。