1

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

4

6 回答 6

2
<ContentControl Content="{Binding SomePropertyThatYieldsTheContent}"/>
于 2009-03-18T12:17:41.213 回答
1

我不知道这是否是最简洁的方式,但如果你使用 a DataTemplate,你可以使用DataTriggers (这里的假设是初始可见性是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>
...
于 2009-03-18T12:23:41.353 回答
1

你有几个选择。正如 Bryan 提到的,数据模板选择器绝对可以工作,尽管我认为它们经常是矫枉过正的。以您的示例为例-如果您想将元素的可见性绑定到 a 中的选择ComboBox,我更喜欢 a ValueConverter。将 传递ComboBox.SelectedItemConverter并让它返回一个可见性值:

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(如果它们很多,那么数据模板选择器方法变得更可取)。

[免责声明:上面的代码是从内存中散列出来的,没有经过测试——可能需要稍微调整一下]

于 2009-03-18T14:43:38.973 回答
0

查看数据模板选择器,Bea Stollnitz在这里有一篇很好的文章。基本上,您将ContentPresenter在每个 UI“插槽”中使用 a,然后使用该ContentTemplateSelector属性来定义您将使用的模板选择器。

于 2009-03-18T14:21:06.593 回答
0

我为每个可能的“视图”创建自定义用户控件。

它们的可见性是使用 c# 更改的,你。需要很少的编码。

这种方法的主要原因是易于开发——设计者关注特定的视图,而不是所有可能存在的控件集。

于 2009-07-22T08:45:10.587 回答
-1

我这样做的方法是将元素相互叠加,并以编程方式将它们的 Visibility 属性从 Visible 更改为 Collapsed 并根据需要再次返回。

于 2009-03-18T12:18:03.707 回答