2009-05-02 19 views
6

Uso el control Infragistics XamDateTimeEditor y deseo agregar una propiedad de dependencia para permitir que el desarrollador elija tener todo el texto seleccionado cuando el control obtiene el foco. He creado un estilo que se utiliza para establecer el comportamiento que quiero, pero quiero que el desarrollador decida si el comportamiento se debe ejecutar en función de una propiedad de dependencia booleana. No estoy seguro de cómo se hace eso.Agregar propiedad de dependencia al control

Respuesta

16

Supongo que lo ha heredado de XamDateTimeEditor para esto.

Si usted puede escribir el código hace referencia a un "estándar" (CLR) Propiedad, entonces usted es bueno ir:

  1. declaran su DependencyProperty
  2. eliminar su campo respaldo y sustituir la aplicación de la propiedad estándar para que acceda a DependencyProperty en lugar del campo de respaldo.

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

Entonces, cuando se accede a IsSelectOnFocusEnabled en el código devolverá el valor actual de la propiedad de dependencia.

También puede configurarlo para recibir notificaciones cada vez que cambie la propiedad, pero no veo por qué lo haría en su caso.

También hay otra opción para este truco, que no usa herencia y una propiedad adjunta si lo desea.

ACTUALIZACIÓN:

bien, ya que se solicitó, he aquí una manera de lograr que para cualquier cuadro de texto. Debe ser fácil de traducir a cualquier evento que use para llevarlo a cabo con otro tipo de control.

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(); 
     } 

    } 

La forma de usarlo es la siguiente, por ejemplo:

<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> 

Esto le muestra cómo configurar la propiedad de activar el comportamiento, y cómo enlazar a otra cosa si es necesario ser. Tenga en cuenta que este ejemplo específico no es perfecto (si lo hace, si hace clic dentro del control, el cuadro de texto tiene una lógica interna que deselecciona el texto, pero es solo un ejemplo de cómo adjuntar comportamientos a los controles mediante propiedades adjuntas)

+0

¿Qué sucede si XamDateTimeEditor no extiende DependencyObject? El código no se compilará Por ejemplo, estoy extendiendo un Comportamiento y quiero agregarle una propiedad de dependencia que no puedo. – rolls

Cuestiones relacionadas