DataTemplate / ContentTemplate - 交换控件

时间:2010-04-15 15:11:09

标签: wpf xaml datatemplate

如何解决以下(简化)问题? M-V-VM上下文。我想在UI上显示文字。 如果用户有权更改文本,我想使用文本框来操作文本。 如果用户没有权限,我想使用标签只显示文本。 我的主要问题:如何交换文本框和标签并绑定Text resp。内容到viewmodel中的同一属性。

感谢您的回答 托尼

1 个答案:

答案 0 :(得分:0)

有几种方法可以实现这一点,并且具有不同程度的易用性。您可以拥有一个DataTemplateSelector,它可以返回给定属性的相应DataTemplate(取决于编写它的方式,您可以将它用于每个属性)。

您可以为每个属性创建一个DataTemplate,并根据DataTrigger更改可见性(这真的很烦人,因为它需要大量的复制和粘贴)。

我认为最简单的方法是使用TextBox的专用ControlTemplate。基本上,当它被禁用时,你可以让它看起来像一个TextBlock,而不是让它变灰:

<ControlTemplate x:Key="PermissionedTextBox" TargetType="{x:Type TextBox}">
    <Border x:Name="bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
        <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" />
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter TargetName="bd" Property="BorderBrush" Value="{x:Null}" />
            <Setter TargetName="bd" Property="Background" Value="{x:Null}" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

然后你可以像这样使用它:

<TextBox Text="{Binding PermissionedText}" IsEnabled="{Binding CanEdit}" />