2011-12-14 23 views
6

Giả sử tôi có một điều khiển tùy chỉnh bao bọc một điều khiển khác (ví dụ MyCustomButton). Tôi tiếp xúc với một nội dung bất động sản, mà kết thúc tốt đẹp sự kiểm soát bên trong:Chaining DependencyProperties

public object Content 
    { 
     get { return innerControl.Content; } 
     set { innerControl.Content = value; } 
    } 

Để cho một người tiêu dùng để ràng buộc vào thuộc tính này, tôi cần phải xác định một thuộc tính phụ thuộc cho nó:

public static DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof (object), typeof (MyCustomButton)); 

nhưng bây giờ tôi cần định nghĩa tài sản của tôi để sử dụng GetValue/SetValue:

public object Content 
    { 
     get { return GetValue(ContentProperty); } 
     set { SetValue(ContentProperty, value); } 
    } 

vì vậy tôi không gói giá trị của kiểm soát bên trong nữa.

Tôi có thể định nghĩa PropertyMetadata để xử lý sự kiện PropertyChanged của DependencyProperty, nhưng sau đó tôi cần một loạt các mã ống nước để giữ cho các giá trị đồng bộ và ngăn chặn loopbacks vô hạn ngày thay đổi.

CẬP NHẬT: Tôi không thể chỉ xuất phát từ Nút vì UserControl của tôi có nhiều mối quan tâm khác.

Có cách nào tốt hơn để thực hiện việc này không?

Trả lời

2

Vâng, tùy thuộc vào các chi tiết cụ thể về lý do tại sao bạn gói một nút có điều khiển người dùng, bạn có thể xác định một điều khiển tùy chỉnh kế thừa từ nút. Sau đó, thay vì gói nút và hiển thị các phương thức và thuộc tính được bao bọc mà bạn muốn, bạn có thể chỉ cần ghi đè các phương thức và thuộc tính có hành vi mà bạn muốn xác định điều khiển tùy chỉnh. Bằng cách này, bạn sẽ nhận được tất cả các chức năng của nút mà không cần phải tái tạo lại bánh xe.

Dưới đây là một liên kết google mà bạn đi qua nó (một trong những người đầu tiên mà tôi tìm thấy - có rất nhiều): http://knol.google.com/k/creating-custom-controls-with-c-net#

Nếu điều khiển người dùng có mối quan tâm khác, điều này có thể không là một lựa chọn cho bạn, nhưng Tôi đang cung cấp câu trả lời này bởi vì mục đích duy nhất mà bạn đã đề cập cho nó là gói nút. Tôi cá nhân ủng hộ việc tạo điều khiển tùy chỉnh và kế thừa thay vì kiểm soát người dùng và gói nếu kiểm soát được đề cập chỉ đơn giản là loại điều khiển được bao bọc/thừa kế cụ thể hơn (tức là nút trong trường hợp của bạn).

Chỉnh sửa: Trong ánh sáng của câu hỏi được cập nhật ...

Bạn có thể làm một cái gì đó dọc theo những dòng này. Đây là XAML của khách hàng kiểm soát người dùng của bạn:

<Grid> 
    <local:MyControl ButtonContent="Click Me!"/> 
</Grid> 
</Window> 

đây là XAML cho người dùng điều khiển bản thân:

<UserControl x:Class="GuiScratch.MyControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:GuiScratch" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 

     <StackPanel> 
      <ContentControl Content="Asdf"/> 
      <Button Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}},Path=ButtonContent}"/> 
     </StackPanel> 

    </Grid> 
</UserControl> 

Và, đây là đoạn code sau:

public partial class MyControl : UserControl 
{ 

    public static readonly DependencyProperty ButtonContentProperty = 
    DependencyProperty.Register("ButtonContent", typeof(object), typeof(MyControl), 
    new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender)); 

    public object ButtonContent 
    { 
     get { return (object)GetValue(ButtonContentProperty); } 
     set { SetValue(ButtonContentProperty, value); } 
    } 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 
} 

Vì vậy, bạn không cần phải xử lý các ràng buộc ở tất cả thông qua mã. XAML khách hàng của bạn liên kết với thuộc tính phụ thuộc của bạn, cũng như XAML của người dùng tự kiểm soát. Trong thời trang này, họ chia sẻ thiết lập thuộc tính phụ thuộc. Tôi chạy điều này trong bàn chải nhỏ của tôi, và kết quả là (ít nhất là sự hiểu biết của tôi về) những gì bạn đang tìm kiếm. Cửa sổ chính hiển thị điều khiển người dùng dưới dạng bảng điều khiển ngăn xếp với văn bản "Asdf" và sau đó nút có văn bản "Nhấp vào tôi!"

+0

Kiểm soát người dùng có các mối quan tâm khác. Đã cập nhật câu hỏi. – Jeff

+0

Bạn có đặc biệt muốn sử dụng thuộc tính "Nội dung" của điều khiển người dùng của mình không?Nếu không, bạn luôn có thể phơi bày một thuộc tính phụ thuộc khác và ràng buộc điều gì đó trong điều khiển người dùng của bạn với giá trị của nó. –

+0

Tôi không quan tâm nó được gọi là gì. Nhưng tôi muốn giá trị của tài sản bị ràng buộc cụ thể đối với một cái gì đó trên sự kiểm soát bên trong. – Jeff

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