2010-07-02 12 views
2

TextBox est censé afficher le montant en dollars masqué pour certains privilèges d'accès. J'ai créé une classe de convertisseur (héritant de IValueConverter) pour gérer le masquage en implémentant la méthode convert.Comment affecter un datatemplate à la zone de texte wpf

public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture) 

Le troisième paramètre est passé à true si le masquage est nécessaire sinon faux.

Appelé comme ceci:

CurrencyCOnverter converter = new CurrencyConverter(); 

this._textbox1.Text = converter.Convert(Amount, typeof(string), !this.IsSuperUser, 
          CurrentCulture).ToString(); 

J'ai environ 12 champs de saisie sur l'interface utilisateur. Au lieu de le faire à 12 places, je définissais DataTemplates dans le dictionnaire des ressources qui ressemble à ceci:

<DataTemplate x:Key="MaskNormalBackgroundTbx"> 

<TextBlock TextAlignment="Right" VerticalAlignment="Center" 
      TextWrapping="WrapWithOverflow" 
      Text="{Binding "Amount" 
        Converter={StaticResource CurrencyDisplayConverter}, 
        ConverterParameter=true}" />  
</DataTemplate> 

<DataTemplate x:Key="NoMaskNormalBackgroundTbx"> 

<TextBlock TextAlignment="Right" VerticalAlignment="Center" 
      TextWrapping="WrapWithOverflow" 
      Text="{Binding "Amount" 
        Converter={StaticResource CurrencyDisplayConverter}, 
        ConverterParameter=false}" />  
</DataTemplate> 

Ma Question: Est-il possible que je peux attribuer ce modèle à textbox en créant une zone de texte personnalisé comme nous attribuons des données modèles pour ListBox?

Merci,

Megan.

Répondre

3

Vous pouvez utiliser un ContentControl pour afficher votre DataTemplate. Une autre idée, que je préfère dans ce cas, est d'utiliser des styles. Ci-dessous le code montre chaud pour faire les deux.

<Window x:Class="Test.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Test="clr-namespace:Test" 
    Height="300" Width="300"> 

    <Window.Resources> 

     <Test:CurrencyDisplayConverter x:Key="CurrencyDisplayConverter" /> 

     <DataTemplate x:Key="MaskNormalBackgroundTbxDT"> 
      <TextBlock TextAlignment="Right" VerticalAlignment="Center" 
      TextWrapping="WrapWithOverflow" 
      Text="{Binding Converter={StaticResource CurrencyDisplayConverter}, ConverterParameter=true}" /> 
     </DataTemplate> 

     <Style x:Key="MaskNormalBackgroundTbxStyle" TargetType="TextBlock"> 
      <Setter Property="TextAlignment" Value="Right" /> 
      <Setter Property="VerticalAlignment" Value="Center" /> 
      <Setter Property="TextWrapping" Value="WrapWithOverflow" /> 
      <Setter Property="Text" Value="{Binding Path=Amount, Converter={StaticResource CurrencyDisplayConverter}, ConverterParameter=true}" /> 
     </Style> 

    </Window.Resources> 
    <StackPanel> 

     <ContentControl 
      Content="{Binding Path=Amount}" 
      ContentTemplate="{StaticResource MaskNormalBackgroundTbxDT}" /> 

     <TextBlock 
      Style="{StaticResource MaskNormalBackgroundTbxStyle}" /> 

    </StackPanel> 

</Window> 
+0

Wallstreet programmeur, Merci pour votre réponse. J'ai déjà une zone de texte personnalisée avec l'étiquette et d'autres modèles et propriétés de contrôle personnalisés en place. Je voudrais ajouter à cela plutôt que de remplacer le contrôle de la zone de texte lui-même. S'il vous plaît laissez-moi savoir si vous avez des idées sur la façon de le faire fonctionner avec un contrôle de zone de texte. Merci. – user296623

+0

Utilisez un style alors comme dans l'échantillon ci-dessus (MaskNormalBackgroundTbxStyle) –

+0

Inséré ce déclencheur dans le style de zone de texte personnalisé: Vous ne savez pas pourquoi, le texte dans la zone de texte n'est jamais masqué. – user296623

Questions connexes