2012-06-21 64 views
1

一些上下文:更改輸入形式成顯示形式

  • 用戶將數據輸入到具有多個輸入控制(標準的文本框,組合框等)的窗口。

  • 用戶在-readmode中打開相同的窗口 - 顯示以前輸入的數據。

當然,輸入表單很容易,並且對於readmode我可以使用IsEnabled dependancyproperty來禁用輸入控件。

是否有可能使用Style with Triggers替換所有輸入控件標籤

回答

1

這將在IsReadOnly爲true時將所有文本框轉換爲TextBlocks。正如你猜測的那樣,樣式上有一個觸發器來改變控件模板。

<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"; 
     } 
    } 
}