วิธีบังคับให้การเชื่อม WPF รีเฟรช?


112

ฉันมีกล่องคำสั่งผสมที่แนบแหล่งรายการโดยใช้การผูกแบบง่าย มีวิธีใดบ้างในการรีเฟรชการเชื่อมโยงนี้เมื่อโหลดกล่องคำสั่งผสมแล้ว


1
การผูกแบบธรรมดาหมายถึงอะไร? โดยปกติเมื่อคุณใช้การผูกตัวควบคุมควรรีเฟรชโดยอัตโนมัติ
Erno

12
Techee ไม่มีความผิด แต่ฉันเชื่อว่า HB สมควรได้รับคำตอบของเขาที่จะได้รับการยอมรับ ;-)
Dani

1
@Dani ฉันไม่แน่ใจว่า Techee จะกลับมาอีก - หกปีครึ่งนับตั้งแต่เขาเข้าสู่ระบบ
The Lonely Coder

คำตอบ:


198

คุณสามารถใช้นิพจน์การผูก:

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

แต่ดังที่ Blindmeis ตั้งข้อสังเกตว่าคุณสามารถเริ่มการแจ้งเตือนการเปลี่ยนแปลงได้เช่นกันหากคอลเล็กชันของคุณดำเนินการINotifyCollectionChanged(เช่นนำไปใช้ในObservableCollection<T>) คอลเลกชันจะซิงโครไนซ์ดังนั้นคุณไม่จำเป็นต้องดำเนินการใด ๆ


ดูเหมือนจะไม่ทำอะไรให้ฉันโดยใช้ ListBox
Jonathan Wood

@JonathanWood: ฉันไม่สามารถบอกได้ว่าคุณมีรหัสแบบไหนรวมถึงความผูกพันของคุณด้วย การผูกได้ผลตั้งแต่แรกหรือไม่?
HB

56

หากคุณใช้ mvvm และ itemssource ของคุณอยู่ใน vm ของคุณ เพียงแค่เรียก INotifyPropertyChanged สำหรับคุณสมบัติคอลเลกชันของคุณเมื่อคุณต้องการรีเฟรช

OnPropertyChanged("YourCollectionProperty");

7
นี่คือแนวทางที่สะอาดที่สุด imho
เถ้า

สิ่งนี้ควรทำเมื่อทำได้ แต่ควรสังเกตว่ามันไม่สามารถใช้ได้จริงเสมอไป ตัวอย่างเช่นหากคุณเชื่อมโยงกับพอร์ตอนุกรมและต้องการตรวจสอบว่าเปิดปิดอัตราการส่งข้อมูล ฯลฯ คุณสามารถสร้างคลาส wrapper รอบ ๆ พอร์ตอนุกรมที่ใช้งานINotifyPropertyChangedได้ แต่คุณจะต้องเก็บพอร์ตไว้เป็นส่วนตัว กระดาษห่อนั้นจึงจำเป็นต้องเขียนคุณสมบัติและวิธีการสำหรับทุกอย่างบนพอร์ตที่คุณใช้ที่อื่นในโครงการเพื่อให้แน่ใจว่าคุณสมบัติที่คุณสนใจจะแจ้งให้ทราบตลอดเวลาจะผ่านกระดาษห่อ
Assimilater

8
นอกจากนี้ฉันเป็นแฟนตัวยงของการใช้nameof(YourCollectionProperty)เมื่อเทียบกับสตริงตัวอักษร ซึ่งจะป้องกันข้อบกพร่องจากการปรับโครงสร้างใหม่และมีความชัดเจนมากขึ้นว่ามีจุดประสงค์อะไร แน่นอนว่าคุณไม่สามารถใช้CallerMemberNameแอตทริบิวต์ที่ดีกว่านี้ได้
Assimilater

31

ในการเพิ่ม 2 เซ็นต์ของฉันหากคุณต้องการอัปเดตแหล่งข้อมูลของคุณด้วยค่าใหม่ของการควบคุมของคุณคุณต้องเรียกUpdateSource()แทนUpdateTarget():

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

1
ชอบคำตอบนี้ดีกว่า
Chopnut

8

MultiBinding รุ่นที่เป็นมิตร ...

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


0

ฉันกำลังดึงข้อมูลจากแบ็กเอนด์และอัปเดตหน้าจอด้วยรหัสเพียงบรรทัดเดียว มันได้ผล ไม่แน่ใจว่าทำไมเราต้องใช้อินเทอร์เฟซ (Windows 10, UWP)

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

This.Bindings.update () รีเฟรชการเชื่อมโยงทั้งหมดในหน้าจอ FYI
Itzdsp

ฉันลองสิ่งนี้.Bindings.Update () ใน usercontrol ใน UWP และไม่มีอยู่
James Esh

ใช่. และสิ่งนี้ยังไม่มีการผูกมัด
James Esh

2
Bindings.Update () มีให้เฉพาะเมื่อใช้การโยงที่คอมไพล์แล้ว (x: Bind) ... และการเชื่อมโยงที่คอมไพล์แล้วจะมีเฉพาะใน UWP
Marian Dolinský

โปรดดูที่ความคิดเห็นของ @ MarianDolinský ดูเหมือนว่าคุณต้องผูกจาก xaml
Itzdsp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.