2010-04-19 27 views
7

Thông thường khi bạn muốn điều khiển dữ liệu 'cập nhật', bạn sử dụng sự kiện "PropertyChanged" để báo hiệu giao diện mà dữ liệu đã thay đổi sau hậu trường.Ràng buộc cập nhật WPF khi liên kết trực tiếp với DataContext w/Converter

Ví dụ, bạn có thể có một TextBlock được ràng buộc với DataContext với một tài sản "DisplayText"

<TextBlock Text="{Binding Path=DisplayText}"/>

Từ đây, nếu DataContext tăng sự kiện PropertyChanged với PropertyName "DisplayText", sau đó văn bản của textblock này sẽ cập nhật (giả sử bạn không thay đổi Chế độ ràng buộc).

Tuy nhiên, tôi có một ràng buộc phức tạp hơn, sử dụng nhiều thuộc tính ngoài nội dung dữ liệu để xác định giao diện cuối cùng của điều khiển. Để thực hiện điều này, tôi liên kết trực tiếp với datacontext và sử dụng một trình biến đổi. Trong trường hợp này tôi đang làm việc với một nguồn hình ảnh.

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

Như bạn thấy, tôi sử dụng một {Binding} không có con đường để ràng buộc trực tiếp đến DataContext, và tôi sử dụng một ImageConverter để chọn hình ảnh tôi đang tìm kiếm. Nhưng bây giờ tôi không có cách nào (mà tôi biết) để nói rằng ràng buộc để cập nhật. Tôi đã cố gắng nâng cao sự kiện được thay đổi với "." như tên đặc tính, không hoạt động.

Điều này có khả thi không? Tôi có phải quấn logic chuyển đổi thành một thuộc tính mà ràng buộc có thể gắn vào, hoặc có cách nào để nói ràng buộc làm mới (mà không làm mới ràng buộc ràng buộc) không?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn! -Adam

Trả lời

17

Cách giải quyết ở đây là để thêm một tài sản để đối tượng của tôi (được sử dụng như các DataContext) gọi là "Tự", mà chỉ đơn giản trở

public Object Self { get { return this; }}

Sau đó, trong ràng buộc tôi đã sử dụng tài sản này:

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

Sau đó, khi tôi gọi

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

nó hoạt động như một sự quyến rũ.

Cảm ơn tất cả.

+0

CẢM ƠN BẠN! Tôi đã điên tìm kiếm điều này và sắp hỏi nó khi nó xuất hiện trên những gợi ý của tôi – HDD

0

Rất tiếc, bạn không hiển thị quá trình triển khai đầy đủ. Nhưng tôi nghĩ rằng nó nên cập nhật, nếu giá trị ràng buộc với GUI cung cấp PropertyChanged-Event.

Kính trọng

+0

Vấn đề là nguồn hình ảnh bị ràng buộc trực tiếp vào datacontext, không phải là thuộc tính của datacontext. Bộ chuyển đổi nhận được trong datacontext và trả về một nguồn hình ảnh. Để làm rõ, cập nhật xảy ra (công trình) nếu tôi sử dụng một ràng buộc có đường dẫn đến thuộc tính của văn bản dữ liệu, và sau đó gọi PropertyChanged cho thuộc tính đó. Tuy nhiên, tôi cần chính đối tượng để xác định hình ảnh (không chỉ là một thuộc tính). Cảm ơn. – Adam

+0

đã có suy nghĩ khi nhập nội dung đó. Tôi sẽ cố gắng để đặt một tài sản trên đối tượng của tôi được gọi là "Tự" mà chỉ trả về chính nó, và sau đó gọi PropertyChanged ("Tự"). Tôi sẽ cho một shot. – Adam

2

Tôi không tin rằng có một cách để hoàn thành chính xác những gì bạn cần với công cụ chuyển đổi hiện tại của bạn. Như bạn đã đề cập, bạn có thể thực hiện phép tính trong ViewModel của mình hoặc bạn có thể thay đổi công cụ chuyển đổi thành IMulitValueConverter.

Từ kịch bản cụ thể của bạn (bộ chuyển đổi gắn với lớp ViewModel và một vài thuộc tính của nó), tôi sẽ dựa vào việc triển khai logic trong ViewModel.

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