2009-07-21 30 views
5

Tôi có một số DataTemplate mà tôi đang sử dụng làm CellTemplate cho số GridViewColumn.WPF sẽ không cho phép tôi đặt một ràng buộc trên con đường của một ràng buộc - có cách nào khác không?

Tôi muốn viết một cái gì đó như thế này cho các DataTemplate:

<DataTemplate 
    x:Key="_myTemplate"> 
    <TextBlock 
     Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" /> 
</DataTemplate> 

GridView của tôi là ràng buộc với một DataTable, và tôi muốn để ràng buộc vào cột của DataTable có tên là bằng Header của GridViewColumn số DataTemplate được đính kèm. [Tôi hy vọng điều đó có ý nghĩa!]

Thật không may, điều này không hiệu quả. Tôi nhận được một XamlParseException: "A 'Binding' không thể được đặt trên thuộc tính 'Đường dẫn' của loại 'Binding'. Một 'Binding' chỉ có thể được thiết lập trên DependencyProperty của một DependenceyObject."

Tôi làm cách nào để thiết lập điều này?

Sửa (nâng bình luận bằng DanM cho câu hỏi)

tôi về cơ bản cần một DataTemplate mà ràng buộc được xác định bởi DataContext và đó cột DataTemplate được gắn vào. Có cách nào khác không?

+0

Không chắc chắn lý do tại sao bạn đã gắn thẻ trang này là silverlight RelativeSource không được hỗ trợ trong silverlight – AnthonyWJones

+0

Xin lỗi về điều đó, Anthony. Tôi không biết Silverlight không hỗ trợ RelativeSource. Tuy nhiên, tôi chưa kết hôn với việc sử dụng RelativeSource, vì vậy nếu có một giải pháp XAML cho câu hỏi của tôi không sử dụng nó, tôi vẫn muốn nghe nó. – devuxer

Trả lời

0

Bạn không thể chỉ định Ràng buộc cho bất kỳ thuộc tính nào. Thuộc tính phải thuộc loại Binding hoặc được triển khai dưới dạng Thuộc tính phụ thuộc trên đối tượng.

Thuộc tính Path của lớp Binding là loại PropertyPath và Ràng buộc không triển khai thuộc tính Đường dẫn làm thuộc tính phụ thuộc. Do đó bạn không thể liên kết động Đường dẫn theo cách bạn đang cố gắng.

Sửa

Bạn về cơ bản muốn nhúng siêu dữ liệu trong dữ liệu ràng buộc của bạn mà ổ đĩa cấu hình của DataTemplate. Điều này không thể được thực hiện trong XAML một mình. Bạn sẽ cần ít nhất một số hỗ trợ từ mã.

Dường như với tôi cách tiếp cận tốt nhất là sử dụng ViewModel. Điều đó làm cho sự ràng buộc trong XAML thẳng về phía trước và đẩy điều này "những gì để ràng buộc với những gì" quyết định xuống vào mã của ViewModel.

+0

Cảm ơn, nhưng câu hỏi của tôi là liệu có một cách khác để hoàn thành mục tiêu của tôi bằng XAML hay không. Tôi về cơ bản cần một DataTemplate có ràng buộc được xác định bởi DataContext * và * mà cột DataTemplate được gắn vào. Có cách nào khác không? – devuxer

+0

@Anthony, Thx để chỉnh sửa của bạn. Câu hỏi của tôi thực sự xuất phát từ một cuộc thảo luận về cách hiển thị dữ liệu pivot trong GridView nơi số cột và đường dẫn liên kết không được biết cho đến khi cơ sở dữ liệu được truy vấn khi chạy. Tôi đang sử dụng MVVM và không có một ViewModel, nhưng giải pháp ban đầu của tôi là tạo ra DataTemplates động trong codebehind bằng cách sử dụng XamlReader.Load(). Điều này đã được phê bình một cách "không tốt" (xem http: // stackoverflow.com/questions/1156336/is-it-possible-to-configure-a-gridview-to-show-pivoted-dữ liệu-sử dụng-static-xaml-if), do đó tôi cố gắng vào một DataTemplate linh hoạt hơn. – devuxer

+1

@Anothony (tiếp theo), DataContext của tôi được đặt thành ViewModel của tôi, và GridView's ItemsSource của tôi được đặt thành thuộc tính của ViewModel (một DataTable), nhưng tôi đoán tôi không hiểu cách ViewModel có thể giải quyết vấn đề như thế nào để ánh xạ từng GridViewColumn vào cột DataTable chính xác mà không cần đến XAML được nạp động. – devuxer

0

Bạn không chỉ muốn điều này?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}} 
+0

Tôi tin rằng những gì bạn có ở đây sẽ đặt hộp văn bản của mỗi ô trong cột phải giống với Tiêu đề. Những gì tôi muốn là để ràng buộc GridViewColumn đến DataColumn thích hợp của một DataTable, nơi tên của các cột trong DataTable khớp với giá trị Header của GridViewColumns. Vì vậy, nếu Header cho một GridViewColumn là "Column3", cột này sẽ bị ràng buộc vào cột có tên "Column3" trong DataTable. Tôi hy vọng điều đó có ý nghĩa :) – devuxer

+0

Tôi nghĩ rằng bạn sẽ gặp vấn đề khi thực hiện nó theo cách bạn đang cố gắng kể từ khi GridViews dựa trên hàng, tức là một ô là một con hoặc một hàng, không phải là một cột. Hãy thử xem loạt bài viết này của Tiến sĩ WPF, nó có thể giúp làm sáng tỏ một số nhầm lẫn: http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx. Một quy tắc cơ bản của WPF, nếu bạn đang cố gắng sử dụng một cái gì đó theo cách nó không được thiết kế cho mọi thứ sẽ trở nên vô cùng khó khăn, nhưng họ thường có một cách dễ dàng để thực hiện nó. Đó là việc tìm kiếm một cách dễ dàng đó là phần khó khăn ... –

+0

@Bryan Tôi sẽ xem xét, cảm ơn! – devuxer

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