如何解决以下(简化)问题? M-V-VM上下文。我想在UI上显示文字。 如果用户有权更改文本,我想使用文本框来操作文本。 如果用户没有权限,我想使用标签只显示文本。 我的主要问题:如何交换文本框和标签并绑定Text resp。内容到viewmodel中的同一属性。
感谢您的回答 托尼
答案 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}" />