控制在WPF中交换UIElements

时间:2009-03-18 12:12:19

标签: wpf tabcontrol contentpresenter uielement

在UI上的某个“插槽”处动态交换UIElement的最小方法是什么?我有一些UIElement s并基于一些外部数据绑定(例如组合框选择)我想要显示其中一个,并且当前可见的一个被隐藏。所以行为有点像TabControl但没有制表符,chrome和tabitem实例。所以我实际上可以使用TabControl并覆盖控件模板。但这真的是最小的方法吗?

6 个答案:

答案 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,然后根据需要再次返回。