2010-04-18 2 views
6

XAML:ag_e_parser_bad_property_value Silverlight Binding Trang Tiêu đề

<navigation:Page ... Title="{Binding Name}"> 

C#

public TablePage() 
{ 
    this.DataContext = new Table() 
    { 
     Name = "Finding Table" 
    }; 
    InitializeComponent(); 
} 

Bắt một lỗi ag_e_parser_bad_property_value trong InitializeComponent tại điểm mà tiêu đề ràng buộc đang xảy ra. Tôi đã thử thêm văn bản tĩnh hoạt động tốt. Nếu tôi sử dụng liên kết ở bất kỳ nơi nào khác, ví dụ:

<TextBlock Text="{Binding Name}"/> 

Điều này cũng không có tác dụng.

Tôi đoán nó đang phàn nàn vì đối tượng DataContext không được đặt nhưng nếu tôi đặt điểm ngắt trước InitializeComponent thì tôi có thể xác nhận nó được điền và thuộc tính Tên được đặt.

Bất kỳ ý tưởng nào?

Trả lời

8

Bạn chỉ có thể sử dụng ràng buộc dữ liệu trên các thuộc tính được hỗ trợ bởi DependencyProperty. Nếu bạn xem tài liệu cho số TextBlock ví dụ: bạn sẽ thấy rằng thuộc tính Text có một trường hợp công khai phù hợp TextProperty trường công khai loại DependencyProperty.

Nếu bạn xem tài liệu cho Page, bạn sẽ thấy rằng không có TitleProperty được xác định, do đó thuộc tính Title không phải là thuộc tính phụ thuộc.

Sửa

Không có cách nào để "ghi đè" tuy nhiên điều này bạn có thể tạo ra một tài sản kèm theo: -

public static class Helper 
{ 
    #region public attached string Title 
    public static string GetTitle(Page element) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     return element.GetValue(TitleProperty) as string; 
    } 

    public static void SetTitle(Page element, string value) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     element.SetValue(TitleProperty, value); 
    } 

    public static readonly DependencyProperty TitleProperty = 
      DependencyProperty.RegisterAttached(
        "Title", 
        typeof(string), 
        typeof(Helper), 
        new PropertyMetadata(null, OnTitlePropertyChanged)); 

    private static void OnTitlePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Page source = d as Page; 
     source.Title = e.NewValue as string; 
    } 
    #endregion public attached string Title 

} 

Bây giờ XAML trang của bạn có thể trông hơi giống: -

<navigation:Page ... 
    xmlns:local="clr-namespace:SilverlightApplication1" 
    local:Helper.Title="{Binding Name}"> 
+0

ah tôi hiểu. Tôi cho rằng không có cách nào để ghi đè điều này? – zXynK

+0

@zXynK: Thuộc tính đính kèm có thể hoạt động trong trường hợp của bạn, chỉnh sửa câu trả lời để hiển thị cách thực hiện. – AnthonyWJones

+0

Cảm ơn sự giúp đỡ của bạn. – zXynK

0

Thêm thông tin sau vào MyPage.xaml.cs:

public new string Title 
{ 
    get { return (string)GetValue(TitleProperty); } 
    set { SetValue(TitleProperty, value); } 
} 
public static readonly DependencyProperty TitleProperty = 
    DependencyProperty.Register("Title", 
     typeof(string), 
     typeof(Page), 
     new PropertyMetadata("")); 

Khi bạn thêm thuộc tính này (thuộc tính phụ thuộc) vào mã của mình, mã của bạn sẽ hoạt động như bình thường.