2010-05-03 31 views
25

Tôi đang cố gắng liên kết điều khiển với thuộc tính Chiều cao/chiều rộng của cha mẹ bằng cách sử dụng ElementName và Đường dẫn. Tuy nhiên, tôi không muốn liên kết với chiều cao thực tế, nhưng chính xác là một nửa chiều cao. Biểu thức Path có thể thực hiện được không?Ràng buộc với phần tử trong WPF: biểu thức đường dẫn có thể làm toán không?

ví dụ: Path={ActualHeight/2}

Tôi không thể tìm cách để làm điều đó. IS có cách tiếp cận thông minh nào khác không?

Cảm ơn!

+0

Chỉ cần một lưu ý: Tùy thuộc vào kịch bản của bạn, một ngôi sao có kích thước đơn giản [Lưới] (http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.aspx) có thể cũng làm công việc. Thông thường, mọi người sử dụng rất nhiều ràng buộc để làm cho giao diện người dùng của họ có kích thước động, mặc dù dễ dàng hơn để thực hiện điều đó với một Grid. Tuy nhiên, tôi không biết yêu cầu chính xác của bạn, vì vậy có thể bạn thực sự cần một IValueConverter như được chỉ ra bởi ArsenMkrt dưới đây. – gehho

+0

Trong trường hợp của tôi, nó là tài sản RadiusX và RaduisY cần một nửa chiều cao/chiều rộng của phần tử gốc (là một lưới). Cảm ơn gợi ý! – John

+1

CalcBinding tạo ra nhiều mã đẹp hơn các giải pháp khác! Kiểm tra câu trả lời của Alex141. – watbywbarif

Trả lời

21

Không nó có thể không, bạn nên sử dụng binding converters

public class MyConverter : IValueConverter 
{ 
public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     return (int)value/2; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
    return null; 
    } 
} 
+2

Trình biến đổi giá trị chỉ tồn tại cho mục đích này - để chuyển đổi giá trị giữa nguồn và đích - http://www.wpftutorial.net/ValueConverters.html. Hoặc nếu đó là quá nhiều, bạn có thể khai báo một thuộc tính chỉ có mới HalfOfActualHeight nếu đó là một tùy chọn. – Gishu

+0

Có vẻ như đây chính xác là những gì tôi cần, ngay cả khi nhiệm vụ quá tầm thường. Cảm ơn! – John

36

tôi sử dụng một MathConverter làm toán trong chuyển đổi mã XAML bindings.The của tôi có thể được tìm thấy here và nó được sử dụng như thế này:

Height="{Binding ElementName=RootWindow, Path=ActualHeight, 
       Converter={StaticResource MathConverter}, 
       [email protected]/2}" 

Nó cũng sẽ xử lý phương trình toán học cao cấp hơn như

Height="{Binding ElementName=RootWindow, Path=ActualHeight, 
       Converter={StaticResource MathConverter}, 
       ConverterParameter=((@VALUE-200)*.3)}" 
4

@ MathConverter của Rachel làm việc tuyệt vời cho tôi, tuy nhiên tôi đã chuyển sang phân tích biểu thức và chỉ để lại bit đó cho NCalc. Bằng cách đó tôi không phải lo lắng về quyền ưu tiên của nhà điều hành.

using NCalc; 

using System; 
using System.Globalization; 
using System.Windows.Data; 

namespace MyProject.Utilities.Converters 
{ 
    public class MathConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo  culture) 
     { 
      // Parse value into equation and remove spaces 
      string expressionString = parameter as string; 
      expressionString = expressionString.Replace(" ", ""); 
      expressionString = expressionString.Replace("@VALUE", value.ToString()); 

      return new Expression(expressionString).Evaluate(); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 
+0

Nhân tiện, khi sử dụng NCalc, mọi biểu thức được lưu trong bộ nhớ cache. Vì điều này đòi hỏi phải làm việc với các giá trị ràng buộc dữ liệu động, tôi khuyên bạn nên bỏ 'EvaluateOptions.NoCache' làm tham số thứ hai cho hàm tạo' Expression'. Bằng cách đó bạn không tiêu tốn quá nhiều bộ nhớ. –

+0

Nó có thể cải thiện mức tiêu thụ bộ nhớ vì biểu thức logic được phân tích cú pháp không được lưu giữ trong từng đối tượng Expression, nhưng tôi nghĩ hiệu năng sẽ bị ảnh hưởng. Mỗi lần đánh giá() được gọi, bạn cần biên dịch biểu thức từ chuỗi gốc. Không có tài liệu nào trên trang web (https://ncalc.codeplex.com/), tôi sẽ chuyển từ những gì tôi thấy trong mã. (https://ncalc.codeplex.com/SourceControl/latest#Evaluant.Calculator/Expression.cs) –

+1

Chắc chắn nó * có thể * thoát hiệu suất. Lợi ích của bộ nhớ đệm chỉ áp dụng nếu biểu thức đang được sử dụng lại thường xuyên. Trong trường hợp của tôi, tôi liên kết với một thuộc tính 'double' đã tạo ra một biểu thức mới mỗi lần tôi thay đổi giá trị, và hiếm khi sử dụng lại các biểu thức trước đó. Đó là một khoảng thời gian-off-off và phụ thuộc vào ứng dụng. –

6

Không, standart binding không hỗ trợ biểu thức trong Path. Nhưng bạn có thể xem dự án của tôi CalcBinding, được phát triển đặc biệt để giải quyết vấn đề này và một số vấn đề khác. Này, bạn có thể viết một cái gì đó như:

<Button Content="{c:Binding ElementName=grid, Path=ActualWidth+Height}"/> 

hoặc

<Label Content="{c:Binding A+B+C }" /> 

hoặc

<Button Visibility="{c:Binding IsChecked, FalseToVisibility=Hidden}" /> 

trong đó A, B, C, IsChecked - thuộc tính của ViewModel và nó sẽ hoạt động đúng

Goodluck!

+2

Tuyệt! Cố gắng này, hoạt động mà không có vấn đề, mã là dễ đọc hơn và ngắn hơn, không có chuyển đổi ngu ngốc nằm xung quanh trong các tập tin! – watbywbarif

+1

Bạn cần thêm tiền tố không gian tên xmlns: c = "clr-namespace: CalcBinding; assembly = CalcBinding". Xem ví dụ https://github.com/Alex141/CalcBinding/blob/master/WpfExample/SecondPage.xaml – VivekDev

1

Hãy xem dự án MathConverter tôi. Nó cho phép các biểu thức rất tiên tiến, bao gồm cả định dạng chuỗi.

Đặc biệt, biểu hiện của bạn sẽ được xử lý như vậy:

Có rất nhiều ví dụ, cũng như giới thiệu cơ bản về cách sử dụng nó trên project's homepage.

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