2010-08-26 26 views
13

nếu tôi có đối tượng được gọi là MyObject, có thuộc tính được gọi là MyChild, chính nó có thuộc tính được gọi là Tên. Làm cách nào tôi có thể nhận được giá trị của thuộc tính Tên đó nếu tất cả những gì tôi có là đường dẫn ràng buộc (ví dụ: "MyChild.Name") và tham chiếu đến MyObject?WPF - Nhận giá trị thuộc tính từ đường dẫn ràng buộc

MyObject 
    -MyChild 
    -Name 
+0

Bạn có thể cung cấp một ví dụ về cách bạn muốn sử dụng ? – Rachel

Trả lời

19

Tôi đã tìm được cách để làm điều này, nhưng nó khá xấu xí và có lẽ không phải rất nhanh ... Về cơ bản, ý tưởng là tạo ra một ràng buộc với đường dẫn đã cho và áp dụng nó vào một thuộc tính của một đối tượng phụ thuộc. Bằng cách đó, các ràng buộc làm tất cả công việc thu hồi giá trị:

public static class PropertyPathHelper 
{ 
    public static object GetValue(object obj, string propertyPath) 
    { 
     Binding binding = new Binding(propertyPath); 
     binding.Mode = BindingMode.OneTime; 
     binding.Source = obj; 
     BindingOperations.SetBinding(_dummy, Dummy.ValueProperty, binding); 
     return _dummy.GetValue(Dummy.ValueProperty); 
    } 

    private static readonly Dummy _dummy = new Dummy(); 

    private class Dummy : DependencyObject 
    { 
     public static readonly DependencyProperty ValueProperty = 
      DependencyProperty.Register("Value", typeof(object), typeof(Dummy), new UIPropertyMetadata(null)); 
    } 
} 
+0

Điều đó có vẻ như rất nhiều máy móc để có được giá trị của một ràng buộc nhưng tôi không thể nghĩ ra một giải pháp mã đích chung tốt hơn. +1 và Chúc mừng. – Berryl

+0

Tuyệt vời, cảm ơn Thomas! Lý do tôi cần một cái gì đó như thế này là bởi vì tôi đã viết một phần mở rộng đánh dấu tùy chỉnh để tải hình ảnh. Tiện ích mở rộng này có thuộc tính Tên cho tên hình ảnh mà giờ đây tôi muốn liên kết với thuộc tính mô hình trong DataTemplate sử dụng phần mở rộng đánh dấu. Tuy nhiên, tôi không thể ràng buộc vì Tên không phải là DP, cũng không thể là: (Đây là giải pháp duy nhất tôi có thể nghĩ đến, vì vậy tôi sẽ thử mã này một lần nữa. Cảm ơn. – devdigital

+0

Điều này hoàn toàn phù hợp với nhu cầu của tôi) nhận và thiết lập giá trị của một thuộc tính của một mô hình khung nhìn cho một đường dẫn ràng buộc) Có cách nào tương tự để có được _type_ của thuộc tính mà sẽ bị ràng buộc với một đường dẫn ràng buộc đã cho không? – lesscode

0

không chắc chắn những gì bạn muốn làm nhưng và làm thế nào (XAML hoặc mã) nhưng bạn luôn có thể đặt tên cho đối tượng của bạn

<MyObject x:Name="myBindingObject" ... /> 

một sau đó sử dụng nó trong mã

myBindingObject.Something.Name 

hoặc in xaml

<BeginStoryboard> 
<Storyboard> 
    <DoubleAnimation 
     Storyboard.TargetName="myBindingObject" 
     Storyboard.TargetProperty="Background" 
     To="AA2343434" Duration="0:0:2" > 
    </DoubleAnimation> 
</Storyboard> 
</BeginStoryboard> 
3

tôi đã phát triển một nuget packagePather.CSharp thực hiện chính xác những gì bạn cần.

Nó chứa một lớp Resolver có phương thức Resolve hoạt động như phương pháp GetValue của @ ThomasLevesque.
Ví dụ:

IResolver resolver = new Resolver(); 
var o = new { Property1 = Property2 = "value" } }; 
var path = "Property1.Property2";  
object result = r.Resolve(o, path); //the result is the string "value" 

Nó thậm chí hỗ trợ bộ sưu tập truy cập qua chỉ số hoặc truy cập từ điển qua phím.
Đường dẫn mẫu là:

"ArrayProperty[5]" 
"DictionaryProperty[Key]" 
+0

Có hỗ trợ truy cập các thuộc tính giao diện và thuộc tính ẩn được triển khai rõ ràng không? – Grx70

+0

@ Grx70 Có. Nó hoạt động thông qua sự phản chiếu, vì vậy nếu thuộc tính tồn tại trên đối tượng và là công khai, nó sẽ nhận được giá trị của nó. – Domysee

0

Tôi đang làm theo cách này. Xin vui lòng cho tôi biết nếu đây là một ý tưởng khủng khiếp, như C# chỉ là một công việc phụ cho tôi vì vậy tôi không phải là một chuyên gia objectToAddTo là loại ItemsControl:

BindingExpression itemsSourceExpression = GetaBindingExression(objectToAddTo); 
object itemsSourceObject = (object)itemsSourceExpression.ResolvedSource; 
string itemSourceProperty = itemsSourceExpression.ResolvedSourcePropertyName; 

object propertyValue = itemsSourceObject.GetType().GetProperty(itemSourceProperty).GetGetMethod().Invoke(itemsSourceObject, null); // Get the value of the property 
Các vấn đề liên quan