2011-08-24 28 views
7

Tương tự như another question, tôi muốn truy cập thuộc tính x: Tên của đối tượng thông qua mã, trong trường hợp này đối tượng được đề cập không phải là FrameworkElement và do đó không có thuộc tính Tên. Tôi cũng không có quyền truy cập vào biến thành viên.Cách truy cập x: Tên-thuộc tính trong mã - đối với các đối tượng không phải Khung công tác?

Trong trường hợp của mình, tôi có một ListView với các cột được đặt tên và muốn mở rộng lớp ListView để nó tiếp tục bố cục cột. Đối với chức năng này, tôi cần các cột được đặt tên và sẽ có ý nghĩa đối với tôi khi sử dụng lại thuộc tính x: Name mà tôi cần phải đặt cho các lý do khác, thay vì thêm thuộc tính "ColumnName" được đính kèm chẳng hạn.

My hiện "giải pháp":

<GridViewColumn Header="X" localControls:ExtendedListView.ColumnName="iconColumn" /> 

mong muốn:

<GridViewColumn Header="X" x:Name="iconColumn" /> 

Vậy là nó có thể để có được những "x: Name" giá trị bằng cách nào đó?

Trả lời

6

Xem các câu trả lời bằng iang trong các chủ đề sau:
How to read the x:Name property from XAML code in the code-behind

Thật không may, đó không phải là khá gì x: Tên không. x: Tên không phải là về mặt kỹ thuật là thuộc tính - đó là chỉ thị Xaml. Trong ngữ cảnh của ứng dụng .NET WPF, x: Tên có nghĩa là:

"Tôi muốn có quyền truy cập vào đối tượng này qua trường này. Ngoài ra, nếu loại này xảy ra tên thuộc tính, vui lòng đặt tên đó. "

Đó là phần thứ hai mà bạn cần, và tiếc là phần thứ hai không áp dụng cho ModelUIElement3D, vì loại đó không có thuộc tính để đại diện cho tên. Vì vậy, có hiệu lực, tất cả điều đó có nghĩa là "Tôi muốn có thể truy cập đối tượng này thông qua một trường có tên này". Và đó là tất cả.

Vì vậy, tất cả x: Tên là nó cho phép bạn truy cập vào đối tượng này bằng cách tạo trường với tên cụ thể đó. Nếu bạn muốn lấy x: Tên của nó, bạn sẽ phải lặp lại tất cả các trường của bạn và xem nếu trường là đối tượng bạn đang tìm kiếm, và trong trường hợp đó, hãy trả lại tên trường.

Ông không đưa ra một phương pháp để làm điều này trong mã phía sau tập tin, mặc dù tôi nghĩ cách tiếp cận hiện tại của bạn với một tài sản kèm theo là một giải pháp tốt hơn nhiều

public string GetName(GridViewColumn column) 
{ 
    var findMatch = from field in this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance) 
        let fieldValue = field.GetValue(this) 
        where fieldValue == column 
        select field.Name; 

    return findMatch.FirstOrDefault(); 
} 
+0

Cảm ơn, giúp :) Guess rằng tài sản gắn liền thực sự là phù hợp hơn sau đó. – floele

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