2010-07-05 29 views
6

Tôi có một điều khiển người dùng trong WPF mà tôi muốn văn bản của một trong các nhãn của nó được đọc từ XAML nơi nó được sử dụng. Do đó ..Đặt giá trị thuộc tính XAML cho điều khiển người dùng

tôi Bản quyền thuộc về:

<UserControl x:Class="muc"> 
     <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">   
      <Label.Content> 
       <Binding ElementName="TestName" Path="." /> 
      </Label.Content> 
     </Label> 
</UserControl> 

Sau đó, sử dụng nó:

<mycontorls:muc TestName="This is a test" /> 

Nhưng nó không hoạt động ... Làm thế nào tôi có thể đọc các tài sản?

+1

Tất cả những gì bạn muốn là một thuộc tính phụ thuộc có tên TestName mà phải được tạo trong đoạn mã của UserControl như được mô tả bởi AlvinfromDiaspar. Sau đó, bạn có thể liên kết nội dung của Label với thuộc tính TestName của UserControl bằng cách sử dụng câu trả lời của ElementName (câu trả lời của Quartermeister ) hoặc liên kết RelativeSource (câu trả lời của Pavel Minaev). – Amsakanna

Trả lời

3

Tôi chỉ làm điều này với Silverlight, nhưng tôi sẽ không ngạc nhiên nếu nó hoạt động theo cùng một cách chính xác!

4

Nếu bạn cung cấp cho các yếu tố UserControl gốc một tên, sau đó bạn có thể tham khảo nó bằng cách sử ElementName:

<UserControl x:Class="muc" 
      Name="rootElement"> 
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold"> 
     <Label.Content> 
      <Binding ElementName="rootElement" Path="TestName" /> 
     </Label.Content> 
    </Label> 
</UserControl> 

Bạn cũng có thể sử dụng cú pháp mở rộng đánh dấu để làm cho nó ngắn hơn một chút:

<UserControl x:Class="muc" 
      Name="rootElement"> 
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold" 
      Content="{Binding TestName, ElementName=rootElement}"/> 
</UserControl> 

Cũng nên nhớ rằng điều khiển của bạn sẽ được tạo trước khi các thuộc tính của nó được thiết lập. Bạn sẽ cần phải thực hiện INotifyPropertyChanged hoặc có TestName là thuộc tính phụ thuộc để ràng buộc được đánh giá lại sau khi thuộc tính được đặt.

0

{Binding ElementName=x} liên kết với một yếu tố với tên x trong cây yếu tố, không có gì ở đây mà giao dịch với tài sản TestName là. Nếu bạn muốn một thuộc tính trên điều khiển người dùng, thì bạn phải xác định thuộc tính trong lớp tương ứng với điều khiển người dùng đó (trong trường hợp của bạn là muc) và sử dụng {Binding RelativeSource={RelativeSource FindAncestor, ...}} để tham chiếu đến điều khiển người dùng của bạn (xem here để biết chi tiết) hoặc đặt tên cho nó để bạn có thể sử dụng ElementName.

8

Tôi đã thử hai câu trả lời đầu tiên và những gì tôi đã làm việc trong mã nhưng không phải trên XAML (cũng không cho phép bạn thấy thay đổi trong thiết kế giao diện khi sử dụng điều khiển).

Để có được một tài sản làm việc giống như bất kỳ một bản địa khác, đây là toàn bộ quá trình: (Mẫu cho biết thêm một tài sản phụ thuộc loại Nullable để hiển thị trong việc kiểm soát dưới dạng văn bản hoặc một mặc định nếu null)

  1. Trong tập tin mã:

    1.a Xác định một tài sản phụ thuộc:

    public static readonly DependencyProperty MyNumberProperty = DependencyProperty.Register("MyNumber", typeof(Nullable<int>), typeof(MyUserControl), new PropertyMetadata(null, new PropertyChangedCallback(OnMyNumberChanged))); 
    

    1.b Thực hiện OnMyNumberChanged Callback:

    private static void OnMyNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args){ 
        // When the color changes, set the icon color PlayButton 
        MyUserControl muc = (MyUserControl)obj; 
        Nullable<int> value = (Nullable<int>)args.NewValue; 
        if (value != null) 
        { 
         muc.MyNumberTextBlock.Text = value.ToString(); 
        } 
        else 
        { 
         muc.MyNumberTextBlock.Text = "N/A"; 
        } 
    } 
    

    1.c thực hiện các tài sản MyNumber (không phụ thuộc) để sử dụng các tài sản phụ thuộc để dễ dàng trong việc sử dụng mã:

    public Nullable<int> MyNumber{ 
        get 
        { 
         return (Nullable<int>)GetValue(MyNumberProperty); 
        } 
        set 
        { 
         SetValue(MyNumberProperty, value); 
         OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value)); // Old value irrelevant. 
        } 
    } 
    
  2. Trong tập tin XAML ràng buộc văn bản kiểm soát TextBlock để tài sản (không phụ thuộc) để lấy giá trị mặc định của tài sản phụ thuộc trong trường hợp nó không được thiết lập bởi người sử dụng của điều khiển (giả sử bạn được gọi là phần tử gốc của bạn trong việc kiểm soát sử dụng "RootElement"):

mã này:

< TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/> 
Các vấn đề liên quan