2009-05-02 38 views
6

Tôi đang sử dụng điều khiển Infamistics XamDateTimeEditor và tôi muốn thêm thuộc tính phụ thuộc vào nó để cho phép nhà phát triển chọn có tất cả văn bản được chọn khi điều khiển được lấy nét. Tôi đã tạo một kiểu được sử dụng để thiết lập hành vi mà tôi muốn nhưng tôi muốn nhà phát triển quyết định xem hành vi có nên được thực hiện dựa trên thuộc tính phụ thuộc boolean hay không. Tôi không chắc làm thế nào được thực hiện.Thêm thuộc tính phụ thuộc để điều khiển

Trả lời

16

Tôi giả sử bạn được kế thừa từ XamDateTimeEditor cho việc này.

Nếu bạn có thể viết mã tham khảo một "tiêu chuẩn" (CLR) tài sản, sau đó bạn là tốt để đi:

  1. tuyên bố DependencyProperty bạn
  2. loại bỏ lĩnh vực sao lưu của bạn và thay thế việc thực hiện tài sản tiêu chuẩn để nó truy cập DependencyProperty thay vì trường sao lưu.

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

Sau đó, khi bạn truy cập IsSelectOnFocusEnabled trong mã của bạn, nó sẽ trả về giá trị hiện tại của tài sản phụ thuộc.

Bạn cũng có thể thiết lập để nhận thông báo bất cứ khi nào tài sản thay đổi, nhưng tôi không hiểu tại sao bạn lại gặp trường hợp này.

Ngoài ra còn có một tùy chọn khác cho thủ thuật này, sử dụng không có thừa kế và thuộc tính đính kèm nếu bạn muốn.

CẬP NHẬT:

OK, vì được yêu cầu, đây là cách để đạt được điều đó cho bất kỳ hộp văn bản nào. Sẽ dễ dàng dịch sang bất kỳ sự kiện nào bạn sử dụng để thực hiện điều đó trên một loại điều khiển khác.

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

    } 

Cách bạn sử dụng nó như sau, ví dụ:

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

này cho bạn thấy làm thế nào để thiết lập thuộc tính để kích hoạt hành vi, và làm thế nào để ràng buộc nó vào cái gì khác nếu cần được. Lưu ý rằng ví dụ cụ thể này không hoàn hảo (nếu bạn duyệt qua nó, nếu bạn nhấp vào bên trong điều khiển, hộp văn bản có logic bên trong thực sự bỏ chọn văn bản, nhưng đó chỉ là ví dụ về cách đính kèm hành vi vào điều khiển thông qua thuộc tính đính kèm).

+0

Điều gì sẽ xảy ra nếu XamDateTimeEditor không mở rộng DependencyObject? Mã sẽ không biên dịch. Ví dụ tôi đang mở rộng một hành vi và muốn thêm một thuộc tính phụ thuộc vào nó mà tôi không thể. – rolls

Các vấn đề liên quan