ฉันมีกล่องคำสั่งผสมที่แนบแหล่งรายการโดยใช้การผูกแบบง่าย มีวิธีใดบ้างในการรีเฟรชการเชื่อมโยงนี้เมื่อโหลดกล่องคำสั่งผสมแล้ว
ฉันมีกล่องคำสั่งผสมที่แนบแหล่งรายการโดยใช้การผูกแบบง่าย มีวิธีใดบ้างในการรีเฟรชการเชื่อมโยงนี้เมื่อโหลดกล่องคำสั่งผสมแล้ว
คำตอบ:
คุณสามารถใช้นิพจน์การผูก:
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
.UpdateTarget();
}
แต่ดังที่ Blindmeis ตั้งข้อสังเกตว่าคุณสามารถเริ่มการแจ้งเตือนการเปลี่ยนแปลงได้เช่นกันหากคอลเล็กชันของคุณดำเนินการINotifyCollectionChanged
(เช่นนำไปใช้ในObservableCollection<T>
) คอลเลกชันจะซิงโครไนซ์ดังนั้นคุณไม่จำเป็นต้องดำเนินการใด ๆ
หากคุณใช้ mvvm และ itemssource ของคุณอยู่ใน vm ของคุณ เพียงแค่เรียก INotifyPropertyChanged สำหรับคุณสมบัติคอลเลกชันของคุณเมื่อคุณต้องการรีเฟรช
OnPropertyChanged("YourCollectionProperty");
INotifyPropertyChanged
ได้ แต่คุณจะต้องเก็บพอร์ตไว้เป็นส่วนตัว กระดาษห่อนั้นจึงจำเป็นต้องเขียนคุณสมบัติและวิธีการสำหรับทุกอย่างบนพอร์ตที่คุณใช้ที่อื่นในโครงการเพื่อให้แน่ใจว่าคุณสมบัติที่คุณสนใจจะแจ้งให้ทราบตลอดเวลาจะผ่านกระดาษห่อ
nameof(YourCollectionProperty)
เมื่อเทียบกับสตริงตัวอักษร ซึ่งจะป้องกันข้อบกพร่องจากการปรับโครงสร้างใหม่และมีความชัดเจนมากขึ้นว่ามีจุดประสงค์อะไร แน่นอนว่าคุณไม่สามารถใช้CallerMemberName
แอตทริบิวต์ที่ดีกว่านี้ได้
ในการเพิ่ม 2 เซ็นต์ของฉันหากคุณต้องการอัปเดตแหล่งข้อมูลของคุณด้วยค่าใหม่ของการควบคุมของคุณคุณต้องเรียกUpdateSource()
แทนUpdateTarget()
:
((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();
MultiBinding รุ่นที่เป็นมิตร ...
private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}
ลองใช้ BindingExpression.UpdateTarget()
ฉันกำลังดึงข้อมูลจากแบ็กเอนด์และอัปเดตหน้าจอด้วยรหัสเพียงบรรทัดเดียว มันได้ผล ไม่แน่ใจว่าทำไมเราต้องใช้อินเทอร์เฟซ (Windows 10, UWP)
private void populateInCurrentScreen()
{
(this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
this.Bindings.Update();
}