2010-04-28 23 views
5

Tôi có thuộc tính phụ thuộc int trên Hộp văn bản tùy chỉnh của tôi, giữ giá trị sao lưu. Nó là ràng buộc với một int? thuộc tính trên DataContext.Thiết lập thuộc tính phụ thuộc WPF không kích hoạt khi PropertyChanged được kích hoạt, nhưng giá trị nguồn không thay đổi

Nếu tôi tăng sự kiện PropertyChanged trong DataContext của tôi và giá trị của thuộc tính nguồn không thay đổi (giữ nguyên), thì trình thiết lập thuộc tính phụ thuộc không được kích hoạt.

Đây là vấn đề, bởi vì tôi muốn cập nhật hộp văn bản tùy chỉnh (xóa văn bản) trên PropertyChanged, ngay cả khi thuộc tính nguồn vẫn giữ nguyên. Tuy nhiên, tôi đã không tìm thấy bất kỳ tùy chọn ràng buộc nào làm những gì tôi muốn (có một tài sản UpdateSourceTrigger, nhưng tôi muốn cập nhật các mục tiêu ở đây, không phải là nguồn). Có thể có một cách tốt hơn để thông báo cho Textbox mà nó cần để xóa văn bản của nó, tôi mở cho bất kỳ đề xuất nào.

Nguồn, theo yêu cầu (giản thể)

DataContext (nguồn):

private int? _foo; 

    public int? Foo 
    { 
     get 
     { 
      // The binding is working, because _foo is retrieved (hits a breakpoint here). 
      // RaisePropertyChanged("Foo") is called from elsewhere, even if _foo's value is not changed 
      return _foo; 
     } 
     set 
     { 
      // Breakpoint is hit on user input, so the binding is working 
      _foo = value; 
      RaisePropertyChanged("Foo"); 
     } 
    } 

Tuỳ chỉnh Textbox (mục tiêu):

public double? Value 
{ 
    get 
    { 
     return (double?)GetValue(ValueProperty); 
    } 
    set 
    { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
      SetValue(ValueProperty, value); 

      // This is the piece of code that needs to be run whenever Value is set to null 
      if (value == null && !String.IsNullOrEmpty(Text)) 
      { 
       Text = String.Empty; 
      } 
     } 
    } 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double?), typeof(CustomTextbox), new PropertyMetadata(null, ValueChangedHandler)); 

    private static void ValueChangedHandler(DependencyObject dependecyObject, DependencyPropertyChangedEventArgs e) 
     { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
     } 
+1

Bạn có thể đăng một số mã không? Nó sẽ làm cho sự hiểu biết vấn đề của bạn dễ dàng hơn nhiều. Làm thế nào chính xác là bạn nâng cao PropertyChanged sự kiện trong DataContext của bạn? – wpfwannabe

+0

Cần cập nhật ngay cả khi nguồn giống nhau. Đăng mã của bạn, giải pháp phải dễ dàng phát hiện. –

+0

Tôi đã đăng một số mã. Ứng dụng quá phức tạp để bao gồm toàn bộ nguồn ở đây. Tên đã được thay thế. –

Trả lời

16

Các XAML sẽ gọi SetValue trực tiếp, thay vì gọi tài sản của bạn setter. Tôi không thể nhớ chính xác các chi tiết cụ thể, nhưng tôi đã gặp phải một vấn đề tương tự cách đây không lâu. Bạn không nên đặt bất kỳ logic nào trong setter cho Value, thay vào đó xác định một cuộc gọi lại khi thuộc tính Dependency thay đổi và cập nhật giá trị từ đó.

+0

Tuyệt vời! Tôi đã tìm kiếm lý do tại sao logic của tôi tại bộ này đã không được thực hiện. –

+0

+1 - Cảm ơn, Valerie, bạn đã cứu ngày của tôi! –

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