2012-06-01 34 views
8

Tôi đang cố gắng để ràng buộc một thuộc tính phụ thuộc thông qua XAML để điều khiển WPF tùy chỉnh của tôi.WPF phụ thuộc Bất động sản không được thiết lập

Đây là cách tôi đăng ký bất động sản phụ thuộc:

public static readonly DependencyProperty AltNamesProperty = 
    DependencyProperty.Register ("AltNames", typeof(string), typeof(DefectImages)); 

public string AltNames 
{ 
    get { return (string) GetValue(AltNamesProperty); } 
    set { SetValue(AltNamesProperty, value); } 
} 

Và Đây là cách tôi gọi nó trong XAML của tôi:

<DataGrid.Columns>     
    <DataGridTemplateColumn IsReadOnly="True"> 
     <DataGridTemplateColumn.CellTemplate> 
      <DataTemplate> 
       <StackPanel Name="StackPanel1" Grid.Column="0" Width="950"> 
        <TextBlock FontSize="16" TextDecorations="None" Text="{BindingPath=StandardName}" Foreground="Black" FontWeight="Bold" Padding="5,10,0,0"></TextBlock> 
        <TextBlock Text="{Binding Path=AltNames}"TextWrapping="WrapWithOverflow" Padding="5,0,0,10"></TextBlock> 
        <!-- this part should be magic!! --> 
        <controls:DefectImages AltNames="{Binding Path=AltNames}"></controls:DefectImages> 
       </StackPanel> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
</DataGrid.Columns> 

Tôi biết AltNames tài sản mà tôi đang cố gắng để ràng buộc vào là một thuộc tính hợp lệ vì tôi có thể hiển thị nó trong một textblock tốt. Tôi có đăng ký thuộc tính Dependency không chính xác không?

Tôi cần làm gì để nhận giá trị chính xác được gán cho AltNames trong mã của tôi sau?

+0

Bạn đã thử 'AltNames = "{Binding Path = AltNames, Mode = TwoWay}" '? Có bất kỳ lỗi ràng buộc nào trong cửa sổ đầu ra trong khi chạy không? – nemesv

+0

@nemesv vừa thử ràng buộc hai chiều, không có may mắn. Không có lỗi liên kết trong cửa sổ đầu ra. – jacobsimeon

+0

Có thể điều này đang bị nhầm lẫn bởi 2 thuộc tính chia sẻ cùng một tên. Bạn đã thử đổi tên một cái chưa? Cách giải quyết mà bạn gắn cờ là câu trả lời có vẻ bất thường! – Gusdor

Trả lời

11

Nhờ @Danko để tôi bắt đầu. Tôi đã đăng ký một cuộc gọi lại để đặt giá trị khi thuộc tính thay đổi.
Đây là những gì cuối cùng tôi đã kết thúc với:

private static void OnDefectIdChanged(DependencyObject defectImageControl, DependencyPropertyChangedEventArgs eventArgs) 
{ 
    var control = (DefectImages) defectImageControl; 
    control.DefectID = (Guid)eventArgs.NewValue; 
} 

/// <summary> 
/// Registers a dependency property, enables us to bind to it via XAML 
/// </summary> 
public static readonly DependencyProperty DefectIdProperty = DependencyProperty.Register(
    "DefectID", 
    typeof (Guid), 
    typeof (DefectImages), 
    new FrameworkPropertyMetadata(
     // use an empty Guid as default value 
     Guid.Empty, 
     // tell the binding system that this property affects how the control gets rendered 
     FrameworkPropertyMetadataOptions.AffectsRender, 
     // run this callback when the property changes 
     OnDefectIdChanged 
    ) 
    ); 

/// <summary> 
/// DefectId accessor for for each instance of this control 
/// Gets and sets the underlying dependency property value 
/// </summary> 
public Guid DefectID 
{ 
    get { return (Guid) GetValue(DefectIdProperty); } 
    set { SetValue(DefectIdProperty, value); } 
} 
2

Có thể bạn cần chỉ định đối số PropertyMetadata cho DependencyProperty.Register, nếu thuộc tính ảnh hưởng đến cách điều khiển được hiển thị. Ví dụ:

DependencyProperty.Register("AltNames", typeof(string), typeof(DefectImages), 
           new FrameworkPropertyMetadata(null, 
           FrameworkPropertyMetadataOptions.AffectsRender)); 
+0

Đã cố gắng điều này, và nó vẫn không cho tôi. Tôi đặt một breakpoint trên setter cho thuộc tính AltNames và nó không bao giờ được thực hiện. – jacobsimeon

+0

Vâng, setter là thực sự không bao giờ thực hiện, bởi vì ràng buộc được thực hiện "đằng sau hậu trường". Bạn có thể thử [constructor PropertyMetadata] (http://msdn.microsoft.com/en-us/library/ms557327.aspx) để chỉ định một phương thức gọi lại được thực thi khi thuộc tính được thay đổi. Ngoài ra, hãy kiểm tra [Làm thế nào tôi có thể gỡ lỗi ràng buộc WPF?] (Http://bea.stollnitz.com/blog/?p=52). –

+0

đó chính xác là những gì tôi vừa làm. Sử dụng gọi lại để thiết lập giá trị làm việc cho tôi. Cảm ơn đã giúp tôi đi đúng hướng. – jacobsimeon

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