DataTemplate / ContentTemplate - элементы управления обменом - PullRequest
0 голосов
/ 15 апреля 2010

Как я могу решить следующую (упрощенную) проблему? M-V-VM контекст. Я хочу показать текст в пользовательском интерфейсе. Если у пользователя есть права на изменение текста, я хочу использовать текстовое поле для манипулирования текстом. Если у пользователя нет прав, я хочу использовать метку, чтобы показывать только текст. Моя главная проблема: как поменять текстовое поле и метку и связать текст соотв. Содержимое того же свойства в viewmodel.

Спасибо за ваши ответы Toni

1 Ответ

0 голосов
/ 15 апреля 2010

Существует несколько способов достижения этого с различной степенью простоты повторного использования. У вас может быть DataTemplateSelector, который может вернуть соответствующий DataTemplate для данного свойства (в зависимости от того, как это написано, вы можете использовать его для каждого из ваших свойств).

Вы можете создать DataTemplate для каждого свойства и изменить видимость на основе DataTrigger (это очень раздражает, так как много копирует и вставляет).

Я думаю, что самый простой способ сделать это с помощью специального ControlTemplate для TextBox. По сути, когда он отключен, вместо того, чтобы скрыть его, вы можете просто сделать его похожим на 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}" />
...