Làm thế nào để buộc một liên kết WPF làm mới?


112

Tôi có một hộp kết hợp với nguồn mặt hàng được đính kèm bằng cách sử dụng ràng buộc đơn giản. Có cách nào để làm mới liên kết này sau khi hộp kết hợp được tải không?


1
Bạn có nghĩa là gì bởi ràng buộc đơn giản? Thông thường, khi bạn sử dụng ràng buộc, điều khiển sẽ tự động làm mới.
Erno

12
Techee, không xúc phạm, nhưng tôi tin rằng HB xứng đáng được chấp nhận câu trả lời của anh ấy ;-)
Dani

1
@Dani Tôi không chắc Techee sẽ quay lại bao giờ - sáu năm rưỡi kể từ khi anh ấy đăng nhập
The Lonely Coder

Câu trả lời:


198

Bạn có thể sử dụng các biểu thức ràng buộc:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

Nhưng như Blindmeis lưu ý, bạn cũng có thể kích hoạt các thông báo thay đổi, hơn nữa nếu bộ sưu tập của bạn triển khai INotifyCollectionChanged(ví dụ: được triển khai trong ObservableCollection<T>), nó sẽ đồng bộ hóa nên bạn không cần thực hiện bất kỳ thao tác này.


Dường như không làm được gì đối với tôi khi sử dụng ListBox.
Jonathan Wood

@JonathanWood: Chà, tôi không thể hiểu bạn có loại mã nào, bao gồm cả ràng buộc của bạn trông như thế nào. Ràng buộc có hoạt động ngay từ đầu không?
HB

56

nếu bạn sử dụng mvvm và nguồn hàng của bạn nằm trong vm của bạn. chỉ cần gọi INotifyPropertyChanged cho thuộc tính bộ sưu tập của bạn khi bạn muốn làm mới.

OnPropertyChanged("YourCollectionProperty");

7
Đây là cách tiếp cận sạch nhất imho.
Ash

Điều này nên được thực hiện nếu có thể, nhưng cần lưu ý rằng nó không phải lúc nào cũng thực tế. Ví dụ: nếu bạn đang ràng buộc với một cổng nối tiếp và muốn kiểm tra xem nó đang mở, đóng, tốc độ truyền, v.v. bạn có thể tạo một lớp bao bọc xung quanh cổng nối tiếp triển khai INotifyPropertyChanged, nhưng bạn sẽ phải giữ cổng ở chế độ riêng tư rằng wrapper và do đó cần phải viết một tài sản và phương pháp cho tất cả mọi thứ trên rằng cổng bạn sử dụng ở những nơi khác trong dự án để đảm bảo rằng các thuộc tính bạn đang quan tâm đến việc thông báo trên luôn đi qua các wrapper
Assimilater

8
Ngoài ra, tôi là một fan hâm mộ lớn của việc sử dụng nameof(YourCollectionProperty)trái ngược với một chuỗi theo nghĩa đen. Điều này ngăn lỗi cấu trúc lại và rõ ràng hơn những gì thực sự được dự định. Đây là khóa học mà bạn không thể sử dụng các CallerMemberNamethuộc tính mà thậm chí còn đẹp hơn
Assimilater

31

Để thêm 2 xu của tôi, nếu bạn muốn cập nhật nguồn dữ liệu của mình với giá trị mới của Điều khiển, bạn cần gọi UpdateSource()thay vì UpdateTarget():

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
Tôi thích câu trả lời này hơn.
Chopnut

8

Phiên bản thân thiện với MultiBinding ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

Tôi đang tìm nạp dữ liệu từ chương trình phụ trợ và cập nhật màn hình chỉ với một dòng mã. Nó đã làm việc. Không chắc, tại sao chúng ta cần triển khai Giao diện. (windows 10, UWP)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

This.Bindings.update () làm mới tất cả các liên kết trong màn hình. FYI
Itzdsp

Tôi đã thử điều này.Bindings.Update () trong điều khiển người dùng trong UWP và nó không tồn tại.
James Esh

Đúng. Và điều này.Bindings vẫn không tồn tại.
James Esh

2
Bindings.Update () chỉ khả dụng khi các ràng buộc đã biên dịch (x: Bind) được sử dụng ... và các ràng buộc đã biên dịch chỉ có sẵn trong UWP
Marian Dolinský 22/12/16

Mời các bạn xem bình luận của @ MarianDolinský. Có vẻ như bạn phải ràng buộc từ xaml
Itzdsp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.