2012-06-21 3 views
1

некоторый контекст:Изменение формы ввода в форму отображения

  • Пользователи вводят данные в окно с несколькими входного контроля (стандартное текстовое поле, выпадающий и т.д.).

  • Пользователи открывают одно и то же окно в -readmode - отображают ранее введенные данные.

Конечно, форма ввода легко и readmode я могу использовать dependancyproperty IsEnabled отключить элементы управления вводом.

Можно ли заменить все элементы управления вводом с этикеток с использованием стиля с триггерами?

ответ

1

Это превратит все текстовые поля в текстовые блоки, когда IsReadOnly является истинным. Как вы уже догадались, в стиле используется триггер, который изменяет шаблон управления.

<Window x:Class="SO_Xaml_ReadOnlyInputForm.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Grid> 
     <Grid.Resources> 

      <Style TargetType="TextBox"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsReadOnly}" 
           Value="True"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="TextBox"> 
            <TextBlock Text="{TemplateBinding Text}" 
               Width="{TemplateBinding Width}" /> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 

     </Grid.Resources> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" />   
     </Grid.RowDefinitions> 

     <CheckBox Grid.Row="0" 
        IsChecked="{Binding IsReadOnly}" 
        Content="Is Read-only?" /> 
     <StackPanel Grid.Row="1" 
        Orientation="Horizontal"> 
      <TextBlock>Item1</TextBlock> 
      <TextBox Text="{Binding Item1Text}" 
        Width="100" /> 
     </StackPanel> 
    </Grid> 
</Window> 

ViewModel класс

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Practices.Prism.ViewModel; 
using Microsoft.Practices.Prism.Commands; 

namespace SO_Xaml_ReadOnlyInputForm 
{ 
    public class ViewModel : NotificationObject 
    { 
     private string _itemText; 
     private bool _isReadOnly; 

     public string Item1Text 
     { 
      get { return _itemText; } 
      set 
      { 
       _itemText = value; 
       RaisePropertyChanged(() => Item1Text); 
      } 
     } 

     public bool IsReadOnly 
     { 
      get { return _isReadOnly; } 
      set 
      { 
       _isReadOnly = value; 
       RaisePropertyChanged(() => IsReadOnly); 
      } 
     } 

     public ViewModel() 
     { 
      Item1Text = "This is the text"; 
     } 
    } 
} 
Смежные вопросы