2009-01-07 37 views
8

Nếu tôi có một điều khiển người dùng định nghĩa:Silverlight: Ràng buộc một đứa trẻ kiểm soát tài sản cho một tài sản trong một điều khiển người dùng

public partial class MainFooter : UserControl 
{ 
    public System.Windows.Media.Color BkColor; 
} 

và đó là XAML:

<UserControl x:Class="Test.MainFooter"> 
    <Grid x:Name="LayoutRoot"> 
     <Rectangle x:Name="rctBottom_Background2" 
        HorizontalAlignment="Stretch" 
        Grid.Row="2"> 
      <Rectangle.Fill> 
       <LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442"> 
        <GradientStop Color="{**How can I bind this to the BkColor property?}"/**> 
        <GradientStop Color="#00FFFFFF" Offset="1"/> 
       </LinearGradientBrush> 
      </Rectangle.Fill> 
     </Rectangle> 
    </Grid> 
</UserControl> 

và sử dụng:

<MyControls:MainFooter x:Name="rcrMainFooter" 
         BkColor="#FFE2B42A"> 
</MyControls:MainFooter> 

Làm cách nào để tôi liên kết màu GradientStop trong Hình chữ nhật với giá trị của thuộc tính BkColor của người dùng đó?

Trả lời

1

Cách duy nhất là làm điều đó theo chương trình (ví dụ: trong sự kiện thay đổi cho BkColor (giả định là một DependencyProperty), hãy thay đổi nó ở các vị trí khác trên bộ điều khiển của bạn. Nếu UserControl của bạn là một cách giải quyết cho điều này (ví dụ như không có hành vi/phương pháp/sự kiện), sau đó thay thế điều khiển người dùng của bạn với một ContentControl và sử dụng Template Bindng.

0
<LinearGradientBrush EndPoint="0.82,0.895" StartPoint="0.911,-0.442">      
<GradientStop Color="{TemplateBinding BackGround}" /> 
<GradientStop Color="#00FFFFFF" Offset="1"/> </LinearGradientBrush> 
8

Thông thường khi tôi đã nhìn thấy câu hỏi này đặt ra câu trả lời là 'bạn phải làm điều đó trong mã', mà nghe như tôi 'ràng buộc Silverlight không hỗ trợ này' - vì vậy bạn phải làm điều đó 'hoàn toàn bằng tay' bằng cách thiết lập các prope rty bằng tay. Nhưng đó không phải là trường hợp:

Ràng buộc Silverlight không hỗ trợ điều này - chỉ XAML Silverlight của nó thì không.

Đây là ví dụ về số UserControl về cơ bản bao bọc DataForm. Trong hàm tạo, bạn chạy ràng buộc có thể liên kết với 'tài sản điều khiển người dùng' của bạn. Hy vọng rằng nếu họ thay đổi hỗ trợ XAML cho điều này trong tương lai thì nó sẽ là tầm thường để quay lại và sửa chữa.

App.xaml

<AddressControl MyHeader="Shipping Address"/> 

AddressControl.xaml

<UserControl> 
    <DataForm Name="dfAddress" Header="BOUND IN CODE"/> 
</UserControl> 

Tùy chọn: indidicate rằng bạn đã bị ràng buộc giá trị trong mã với một lời nhận xét

AddressContr ol.xaml.cs

publicAddressControl() 
{ 
    InitializeComponent(); 

    // bind the HeaderProperty of 'dfAddress' to the 'MyHeader' dependency 
    // property defined in this file 
    dfAddress.SetBinding(DataForm.HeaderProperty, 
    new System.Windows.Data.Binding { Source = this, 
             Path = new PropertyPath("MyHeader") }); 
} 

// standard string dependency property 
public string MyHeader 
{ 
    get { return (string)GetValue(MyHeaderProperty); } 
    set { SetValue(MyHeaderProperty, value); } 
} 

public static readonly DependencyProperty MyHeaderProperty = 
     DependencyProperty.Register("MyHeader", typeof(string), 
     typeof(AddressControl), null); 

này liên kết với các tài sản trên MyHeaderAddressControl usercontrol của tôi vào Header tài sản trên DataForm. Tôi đã biến nó thành 'My' chỉ để dễ đọc - nhưng tôi thực sự chỉ sử dụng 'Header' trong mã thực của mình.

Thật xấu hổ, chúng tôi vẫn không thể làm điều này trong XAML, nhưng nó tốt hơn những gì tôi lần đầu tiên cố gắng nắm bắt các sự kiện DataContextChanged và sau đó đặt thủ công mọi thứ.

+0

Nhiều NHIỀU nhờ cho câu trả lời này - nó đã giúp chúng tôi tìm ra cách để làm pass-thru bắt buộc đối với các điều khiển. – Quango

0

Có một tùy chọn khác.Trong khi nó xuất hiện rằng bạn không thể ràng buộc các giá trị màu sắc tự, bạn có thể ràng buộc toàn bộ tài sản Background, như vậy:

< Border BorderThickness = "2" BorderBrush = "Black" CornerRadius = "20" Background = "{Binding Đường dẫn = Background}"/>

... và sau đó ...

Public ReadOnly Property Background As Brush 
    Get 
     Dim lgb As New LinearGradientBrush 
     lgb.GradientStops = New GradientStopCollection From {New GradientStop With {.Color = PrimaryColor, .Offset = 0.0}, New GradientStop With {.Color = SecondaryColor, .Offset = 1.0}} 
     lgb.StartPoint = New Point(0, 0) 
     lgb.EndPoint = New Point(1, 1) 
     Return lgb 
    End Get 
End Property 
Các vấn đề liên quan