xem xét tài sản ViewModel sau:Một trì hoãn ràng buộc từ nguồn
private string _slowProperty;
public string SlowProperty
{
get { return _slowProperty; }
set
{
_slowProperty = value;
RaisePropertyChanged("SlowProperty");
}
}
Đó là ràng buộc với một hộp, như vậy:
<TextBox Text="{Binding SlowProperty}" />
Bây giờ, vấn đề ở đây là mỗi khi giá trị của SlowProperty thay đổi, và nó làm như vậy khá thường xuyên, hộp văn bản sẽ đi và cố gắng để có được giá trị của nó, đó là, khá chậm. Tôi có thể làm giảm bớt tình hình bằng cách sử dụng async ràng buộc, tuy nhiên, mà vẫn sẽ lãng phí chu kỳ CPU.
Thay vào đó, những gì tôi muốn có một cái gì đó như:
<TextBlock Text="{z:DelayedSourceBinding SlowProperty}" />
nào sẽ cố gắng để có được những ràng buộc sau khi một sự chậm trễ nhất định. Vì vậy, ví dụ: nếu SlowProperty
thay đổi 5 lần liên tiếp, trong một thời gian ngắn, thì chỉ văn bản cuối cùng mới hiển thị trong hộp văn bản.
Tôi đã tìm thấy following project mà thực hiện một cái gì đó như thế, vì vậy nó ví dụ của tôi, tôi có thể sử dụng nó như vậy:
<TextBox Text="{z:DelayBinding Path=SearchText}" />
Vấn đề với nó, là nó chỉ cập nhật các ràng buộc mục tiêu sau một sự trì hoãn. Đường dẫn nguồn, tuy nhiên, được đánh giá và getter của nó được thực thi khi mọi thay đổi của nguồn. Trong trường hợp của SlowProperty
vẫn sẽ lãng phí chu kỳ CPU.
Tôi đã cố gắng tạo lớp ràng buộc bị trì hoãn của riêng mình, nhưng got stuck. Có chất kết dính nào khác có thể làm bất cứ thứ gì như thế không?
Đối với đầy đủ lợi ích, đây là 2 dự án khác thực hiện nhiệm vụ tương tự, tuy nhiên, không ai trong địa chỉ vấn đề tôi đang trải qua:
DeferredBinding - Một giải pháp tương tự để DelayBinding. Tuy nhiên, nó phức tạp hơn một chút để sử dụng.
DelayedBindingTextBox - Thực hiện ràng buộc bị trì hoãn bằng cách sử dụng điều khiển hộp văn bản tùy chỉnh.
Cảm ơn!
Colin, tuyệt vời. Tất cả các vấn đề CS có thể được giải quyết bằng cách thêm một lớp khác nữa của sự hướng dẫn! :) –
Bạn có lẽ đúng, đây thực sự là một vấn đề cần được giải quyết ở cấp VM. Mặc dù, tôi vẫn muốn biết nếu nó có thể làm một ràng buộc tùy chỉnh, giống như một trong những tôi mô tả. – VitalyB