2012-06-29 13 views
12

Tôi có thể có những điều sau đây (số ActualWidth chia cho 2) không?Toán tử toán học có thể được áp dụng cho đường dẫn Ràng buộc không?

<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}"> 

Dường như không hoạt động đối với tôi.

Cảm ơn.

+0

Bạn đang cố gắng làm gì? Nhận 'Chiều rộng' được đặt thành một nửa giá trị của' SP1.ActualWidth'? Nếu vậy, một 'Chuyển đổi 'có lẽ là những gì bạn đang theo sau. –

+0

Vui lòng không sử dụng 'ActualWidth' trong các liên kết vì nó không phải là thuộc tính phụ thuộc và sẽ không nhất thiết phải làm những gì bạn mong đợi. Xem câu hỏi http://stackoverflow.com/questions/7403151 (WPF) và http://stackoverflow.com/questions/1602148 (Silverlight). –

+0

@PhilipKendall, vâng đó là những gì tôi đang cố gắng làm. Tôi muốn SP2 là một nửa chiều rộng của SP1 mỗi khi cửa sổ được thay đổi kích cỡ. –

Trả lời

19

Bạn có thể sử dụng trình chuyển đổi tùy chỉnh để thực hiện các phép tính đơn giản trực tiếp trong XAML.

Hãy xem, ví dụ, tại thực hiện điều này: sử dụng

MathConverter

đơn giản:

<RotateTransform Angle="{Binding Text, ElementName=Seconds, 
    Converter={ikriv:MathConverter}, ConverterParameter=x*6}" /> 

Phương pháp cổ điển là để tạo ra một tài sản readonly tính. Vì vậy, trong trường hợp đơn giản này, bạn có thể thêm thuộc tính thứ hai HalfWidth.

public double HalfWidth 
{ 
    get 
    { 
     return ActualWidth/2.0; 
    } 
} 

Tin xấu là khi ActualWidth được cập nhật, các StackPanel trên quan điểm ràng buộc để HalfWidth sẽ không cập nhật. Điều này là do chế độ xem không biết rằng HalfWidth đã thay đổi.

Bằng cách tăng sự kiện đã thay đổi thuộc tính trên HalfWidth trong setter của ActualWidth, chế độ xem sẽ truy vấn HalfWidth và do đó truy xuất giá trị chính xác.

private double _actualWidth; 
public double ActualWidth 
{ 
    get 
    { 
     return _actualWidth; 
    } 
    set 
    { 
     if (_actualWidth != value) 
     { 
      _actualWidth = value; 
      OnPropertyChanged("ActualWidth"); 
      OnPropertyChanged("HalfWidth"); 
     } 
    } 
} 

Nguyên tắc chính về phương pháp này là sẽ sớm trở thành cơn ác mộng khi chúng tôi có nhiều thuộc tính được tính toán không có người định cư.

Đó là lý do tại sao (trong mẫu MVVM) cá nhân tôi thích sử dụng trình chuyển đổi tùy chỉnh.

+0

Cảm ơn. Làm thế nào người ta quyết định xem có nên trải qua tất cả nỗ lực này hay chỉ để có một dòng trong trình xử lý sự kiện SizeChanged của Windows trong mã sau? –

+0

@Old Geezer Tôi đã cập nhật câu trả lời của mình –

2

Không, bạn chỉ có thể sử dụng các thuộc tính (và lập chỉ mục thành các mảng/bộ sưu tập trong một số trường hợp) trong các ràng buộc. Thay vào đó, bạn cần phải liên kết với thuộc tính thông báo trả về giá trị dự kiến ​​(ví dụ: ActualWidth/2) hoặc sử dụng trình chuyển đổi trả về giá trị khi tính toán của bạn được áp dụng.