2009-10-27 35 views
6

Tôi đang sử dụng mẫu WPF và MVVM trong giao diện người dùng của mình. Trong ViewModel của tôi, tôi có một danh sách chứa khoảng cách tính bằng milimét, mà tôi hiển thị trong một ListView bằng cách ràng buộc ListView.ItemsSource vào Danh sách. Tuy nhiên, tôi muốn các giá trị được hiển thị để sử dụng đơn vị tự nhiên hơn - hoặc là mét hoặc chân tùy thuộc vào trạng thái của hộp kiểm "chỉ số".WPF và MVVM: Thay đổi chuyển đổi ràng buộc dữ liệu khi chạy

Tôi đã viết một vài lớp đơn giản, MillimetresToMetresConverter và MillimetresToFeetConverter, cả hai đều triển khai IValueConverter. Mặc dù tôi có thể đặt thuộc tính Chuyển đổi trên dữ liệu của tôi gắn kết với một hoặc khác, tôi không chắc chắn làm thế nào để thay đổi giữa các bộ chuyển đổi khi trạng thái của hộp kiểm thay đổi. Kế hoạch của tôi là có một trường "IValueConverter lengthConverter" trên ViewModel của tôi mà tôi có thể đặt thành một bộ chuyển đổi hoặc cái kia, sau đó trong XAML của tôi làm ...="{Binding Converter={Binding Path=lengthConverter}}" - tiếc là nó không hoạt động vì Chuyển đổi không phải là thuộc tính phụ thuộc.

Làm cách nào để thay đổi bộ chuyển đổi được sử dụng bởi ràng buộc dữ liệu khi chạy?

+0

Bạn sẽ có thể sử dụng DependencyObject.GetBinding (DependencyProperty), ví dụ: myTextBlock.GetBinding (TextBlock.TextProperty) để nhận (và sửa đổi) đối tượng Binding. – Heinzi

+0

Thật không may, theo mô hình MVVM có nghĩa là mã sẽ cần phải sống trong ViewModel - mà không có tham chiếu đến khung nhìn và do đó không thể chạm vào "myTextBlock". – user200783

Trả lời

0

Nếu tôi có thể đề xuất giải pháp thay thế đơn giản: Tạo một FormatMillimetresConverter nhỏ trong Chế độ xem của bạn, có thuộc tính UseMetric bị ràng buộc vào hộp kiểm "chỉ số".

+0

Cảm ơn - nhưng một khi tôi đã có một FormatMillimetresConverter trong ViewModel, làm thế nào để có được ListView để sử dụng nó? – user200783

+0

Điểm tốt. :-) Bạn có thể xuất một ví dụ của nó như là một tài sản tĩnh của ViewModel của bạn và sau đó truy cập nó thông qua "... Converter = {x: tĩnh địa phương: ViewModel.MyFormatMillimetresConverter}", nhưng bằng cách nào đó mà không phải là rất thanh lịch ... – Heinzi

+0

Điều gì về việc tạo ra FormatMillimetresConverter trong ? Sau đó, nó có sẵn như là một tài nguyên tĩnh và bạn có thể đính kèm nó như là một công cụ chuyển đổi cho ListView.ItemsSource với "... Converter = {StaticResource ..." và vào hộp kiểm với "{Binding Source = {StaticResource ...". – Heinzi

5

Hầu hết thời gian khi sử dụng phương pháp MVVM, bạn có thể thực hiện tác vụ định dạng trong các lớp VM. Trong trường hợp của bạn, bạn có thể thêm thuộc tính Định dạng vào lớp VM và dựa trên giá trị của thuộc tính Định dạng, trả về một chuỗi được định dạng tốt.

Xem this discussion để biết thêm thông tin.

+0

Chính xác. Bộ chuyển đổi rất hiếm trong ứng dụng MVVM, thường chỉ xuất hiện trong các điều khiển tùy chỉnh. –

+0

Giả sử ViewModel của tôi có thuộc tính 'List Distances' mà tôi ràng buộc ListView.ItemsSource của mình. Bạn có gợi ý rằng thay vì Distances.get trả về danh sách, nó sẽ trả về một danh sách khác - với chuyển đổi đã được áp dụng chưa? – user200783

+0

@Paul: vâng. Một ViewModel chỉ là một ValueConverter bit ;-). Bạn có thể đọc một cuộc thảo luận tương tự trên diễn đàn thảo luận của các thành viên trong WPF: http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e –

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