2009-05-02 16 views
6

Używam formantu Infragistics XamDateTimeEditor i chcę dodać do niego właściwość zależności, aby umożliwić programistom wybór, aby cały tekst został zaznaczony, gdy fokus zostanie ustawiony. Stworzyłem styl, który służy do ustawienia pożądanego zachowania, ale chcę, aby programista zadecydował, czy zachowanie powinno zostać wykonane w oparciu o zależną właściwość boolowską. Nie jestem pewien, jak to się robi.Dodaj właściwość zależność do kontrolowania

Odpowiedz

16

Zakładam, że odziedziczyłeś po tym XamDateTimeEditor.

Jeśli można napisać kod odwoływania się do „standard” (CLR) nieruchomości, to jesteś dobry, aby przejść:

  1. zadeklarować swój DependencyProperty
  2. usunąć pole oporowe i zastąpić wdrażania programu standardową właściwość, aby uzyskać dostęp do DependencyProperty zamiast pola kopii.

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

Wtedy, gdy masz dostęp do IsSelectOnFocusEnabled w kodzie zwróci wartość bieżącą zależność własności.

Można również ustawić, aby otrzymywać powiadomienia, gdy właściwość się zmienia, ale nie rozumiem, dlaczego miałbyś w tym przypadku.

Istnieje również inna opcja dla tej sztuczki, która nie korzysta z dziedziczenia i dołączonej właściwości, jeśli chcesz.

UPDATE:

OK, ponieważ został on wymagany, oto droga do osiągnięcia, że ​​dla dowolnego pola tekstowego. Powinno być łatwe do przetłumaczenia na dowolne zdarzenie, które wykorzystasz do przeprowadzenia innego rodzaju kontroli.

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

    } 

Sposób korzystania jest w następujący sposób, na przykład:

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

To pokazuje, jak skonfigurować właściwość, aby uaktywnić zachowanie, i jak powiązać go do czegoś innego, jeśli potrzebujesz być. Należy zauważyć, że ten konkretny przykład nie jest doskonały (jeśli przez zakładkę działa, jeśli klikniesz wewnątrz formantu, pole tekstowe ma wewnętrzną logikę, która faktycznie odznacza tekst, ale jest to tylko przykład na to, jak przywiązać zachowania do kontrolek poprzez załączone właściwości).

+0

Co zrobić, jeśli XamDateTimeEditor nie rozszerza DependencyObject? Kod nie zostanie skompilowany. Na przykład rozszerzam Zachowanie i chcę dodać do niego właściwość zależności, której nie mogę. – rolls

Powiązane problemy