2009-05-02 29 views
6

我正在使用Infragistics XamDateTimeEditor控件,我想向其添加依賴項屬性以允許開發人員在控件獲取焦點時選擇所有文本。我創建了一種用於設置我想要的行爲的樣式,但我希望開發人員根據布爾依賴項屬性決定是否應該執行行爲。我不確定這是如何完成的。將依賴項屬性添加到控件

回答

16

我假設你爲此繼承了XamDateTimeEditor。

如果你可以編寫代碼引用一個「標準」(CLR)的財產,那麼你是好去:

  1. 聲明你的DependencyProperty
  2. 刪除您的支持字段和替換的實施標準屬性,以便它訪問DependencyProperty而不是後臺字段。

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

然後,當你在你的代碼中訪問IsSelectOnFocusEnabled它將返回依賴項屬性的當前值。

你也可以設置它來接收通知,每當屬性發生變化,但我不明白你爲什麼會在你的情況。

此技巧還有另一種選擇,如果您願意,它不使用繼承和附加屬性。

UPDATE:

OK,因爲它要求的,這裏有一個方法來實現,對於任何文本框。應該很容易翻譯成你使用其他類型的控制進行的事件。

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

    } 

您使用其計算方法如下,例如方式:

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

這說明你如何設置該屬性激活的行爲,以及如何將其綁定到別的東西,如果需要是。 請注意,此特定示例並不完美(如果通過選項卡工作,如果在控件內部單擊,文本框具有實際取消選擇文本的內部邏輯,但這只是一個示例,說明如何通過附加屬性將行爲附加到控件)。

+0

如果XamDateTimeEditor沒有擴展DependencyObject會怎麼樣?代碼不會編譯。例如,我正在擴展一個行爲,並希望添加一個依賴項屬性,我不能。 – rolls 2016-11-18 03:29:33