首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataTemplate / ContentTemplate -交换控制

DataTemplate / ContentTemplate -交换控制
EN

Stack Overflow用户
提问于 2010-04-15 23:11:09
回答 1查看 539关注 0票数 0

如何解决以下(简化)问题?M-V-VM上下文。我想在UI上显示文本。如果用户有权更改文本,我希望使用文本框来操作文本。在用户没有权限的情况下,我希望使用标签来仅显示文本。我的主要问题是:如何分别交换文本框和标签以及绑定文本。将内容添加到viewmodel中的同一属性。

谢谢你的回答,托尼

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-15 23:30:01

有几种方法可以实现这一点,具有不同程度的重用。您可以有一个DataTemplateSelector,它可以为给定的属性返回适当的DataTemplate (根据这段代码的编写方式,您可以对每个属性使用它)。

您可以为每个属性创建一个DataTemplate,并基于DataTrigger更改可见性(这会变得非常烦人,因为它需要大量的复制和粘贴)。

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

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<TextBox Text="{Binding PermissionedText}" IsEnabled="{Binding CanEdit}" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2646526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档