2009-05-02 15 views
6

Sto utilizzando il controllo Infragistics XamDateTimeEditor e desidero aggiungere una proprietà di dipendenza per consentire allo sviluppatore di scegliere di avere tutto il testo selezionato quando il controllo diventa attivo. Ho creato uno stile che viene utilizzato per impostare il comportamento che voglio, ma voglio che lo sviluppatore decida se il comportamento debba essere eseguito sulla base di una proprietà di dipendenza booleana. Non sono sicuro di come sia fatto.Aggiungere la proprietà di dipendenza al controllo

risposta

16

Presumo che tu abbia ereditato da XamDateTimeEditor per questo.

Se è possibile scrivere il codice fa riferimento a un (CLR) proprietà "standard", allora siete pronti per partire:

  1. dichiarare il vostro DependencyProperty
  2. rimuovere il campo di supporto e sostituire l'attuazione del proprietà standard in modo che acceda a DependencyProperty anziché al campo di supporto.

    public class MyXamDateTimeEditor : XamDateTimeEditor 
    { 
        public static readonly DependencyProperty IsSelectOnFocusEnabledProperty = 
         DependencyProperty.Register("IsSelectOnFocusEnabled", typeof(bool), 
        typeof(MyXamDateTimeEditor), new UIPropertyMetadata(false)); 
    
        public boolIsSelectOnFocusEnabled 
        { 
         get 
         { 
          return (bool)GetValue(IsSelectOnFocusEnabledProperty); 
         } 
         set 
         { 
          SetValue(IsSelectOnFocusEnabledProperty, value); 
         } 
        } 
    } 
    

Poi, quando si accede IsSelectOnFocusEnabled nel codice restituirà il valore corrente della proprietà di dipendenza.

È inoltre possibile configurarlo per ricevere notifiche ogni volta che la proprietà cambia, ma non vedo perché si dovrebbe nel vostro caso.

C'è anche un'altra opzione per questo trucco, che non usa ereditarietà e una proprietà allegata se lo desideri.

UPDATE:

OK, da quando è stato richiesto, ecco un modo per ottenere che per ogni casella di testo. Dovrebbe essere facile da tradurre in qualunque evento tu usi per farlo su un altro tipo di controllo.

public class TextBoxBehaviors 
    { 
     public static bool GetIsSelectOnFocusEnabled(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(IsSelectOnFocusEnabledProperty); 
     } 

     public static void SetIsSelectOnFocusEnabled(DependencyObject obj, bool value) 
     { 
      obj.SetValue(IsSelectOnFocusEnabledProperty, value); 
     } 

     public static readonly DependencyProperty IsSelectOnFocusEnabledProperty = 
      DependencyProperty.RegisterAttached("IsSelectOnFocusEnabled", typeof(bool), 
      typeof(TextBoxBehaviors), 
      new UIPropertyMetadata(false, new PropertyChangedCallback(OnSelectOnFocusChange))); 

     private static void OnSelectOnFocusChange(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      if (d is TextBox) 
      { 
       var tb = d as TextBox; 
       if ((bool)e.NewValue) 
       { 
        tb.GotFocus += new RoutedEventHandler(tb_GotFocus); 
       } 
       else 
       { 
        tb.GotFocus -= new RoutedEventHandler(tb_GotFocus); 
       } 
      } 
     } 

     static void tb_GotFocus(object sender, RoutedEventArgs e) 
     { 
      var tb = sender as TextBox; 

      tb.SelectAll(); 
     } 

    } 

Il modo in cui lo si utilizza è il seguente, ad esempio:

<Window x:Class="WpfApplication2.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication2"   
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" /> 
      <ColumnDefinition Width="Auto" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 
     <TextBox Text="No Select All" x:Name="TextBox1"/> 
     <CheckBox Content="Auto Select" 
        Grid.Column="1" 
        IsChecked="{Binding Path=(local:TextBoxBehaviors.IsSelectOnFocusEnabled), ElementName=TextBox1, Mode=TwoWay}" /> 
     <TextBox Grid.Row="1" Text="djkhfskhfkdssdkj" 
       local:TextBoxBehaviors.IsSelectOnFocusEnabled="true" /> 
    </Grid> 
</Window> 

Questo mostra come impostare la proprietà per attivare il comportamento, e come associare a qualcosa d'altro, se necessario essere. Si noti che questo esempio specifico non è perfetto (se lo si sfoglia, se si fa clic all'interno del controllo, la casella di testo ha una logica interna che deseleziona effettivamente il testo, ma questo è solo un esempio su come allegare comportamenti ai controlli tramite proprietà collegate).

+0

Cosa succede se XamDateTimeEditor non estende DependencyObject? Il codice non verrà compilato. Per esempio sto estendendo un comportamento e voglio aggiungere una proprietà di dipendenza ad esso che non posso. – rolls

Problemi correlati