เรามีแอปพลิเคชันไคลเอ็นต์-เซิร์ฟเวอร์ซึ่งมีข้อกำหนดในการสร้างมุมมองแบบไดนามิก เซิร์ฟเวอร์จะส่งสตริง XAML พร้อมกับข้อมูล (Dctionary‹ string, string>) ไปยังไคลเอนต์ ซึ่งจะสร้างมุมมองจากสตริง Xaml ที่ได้รับและผูกข้อมูลเข้ากับ View
นี่คือตัวอย่างสตริง XAML:
<StackPanel>
<TextBox>
<TextBox.Text>
<Binding RelativeSource="{{RelativeSource Self}}" Path="DataContext"
Converter="{{StaticResource fieldBindingConverter}}" ConverterParameter="ID_Id"
UpdateSourceTrigger="PropertyChanged">
</Binding>
</TextBox.Text>
</TextBox>
<TextBox>
<TextBox.Text>
<Binding RelativeSource="{{RelativeSource Self}}" Path="DataContext"
Converter="{{StaticResource fieldBindingConverter}}" ConverterParameter="ID_Name"
UpdateSourceTrigger="PropertyChanged">
</Binding>
</TextBox.Text>
</TextBox>
</StackPanel>
ข้อมูลจะมีลักษณะดังนี้:
new Dictionary<string, string>
{
{"ID_Id", "1"},
{"ID_Name", "John"}
};
ไคลเอนต์จะสร้างมุมมองโดยใช้ XamlReader.Load() และสร้างหน้าต่างเพื่อโฮสต์เป็นเนื้อหา ลูกค้ายังกำหนดข้อมูลที่ได้รับให้กับ Window.DataContext
window.DataContext = dictionaryData;
เนื่องจากกล่องข้อความทั้งสองสืบทอด DataContext จากหน้าต่าง คุณสมบัติ Text จึงเชื่อมโยงกับพจนานุกรม ตัวแปลงการรวม "fieldBindingConverter" ดึงค่าที่ถูกต้องออกจากพจนานุกรมโดยใช้ ConverterParameter ซึ่งมีคีย์
ดังนั้นกล่องข้อความทั้งสองจะแยก "1" และ "John" ตามลำดับเมื่อสร้าง View ครั้งแรก
ปัญหาเกิดขึ้นเมื่อข้อมูลใหม่มาถึงฝั่งไคลเอ็นต์
new Dictionary<string, string>
{
{"ID_Id", "2"},
{"ID_Name", "Peter"}
};
โดยการรีเซ็ต DataContext ของหน้าต่างโฮสติ้งจะไม่ทำให้การเชื่อมโยงในกล่องข้อความรีเฟรชตัวเอง
window.DataContext = newDictionaryData;
ในความเป็นจริง DataContext ของกล่องข้อความยังคงแคชค่าข้อมูลเก่า
ดูเหมือนว่ากล่องข้อความจะใช้สำเนาของ DataContext หลักเมื่อเริ่มต้นครั้งแรกเท่านั้น จากนั้นจึงใช้งานได้กับสำเนาในเครื่องนั้นหลังจากนั้นเท่านั้น
ปรากฏว่าไม่ใช่เรื่องง่ายที่จะมี ViewModel และใช้ INotifyPropertyChanged ในสถานการณ์นี้ เนื่องจากคีย์ "ID_XX" อาจแตกต่างกันไปตาม Views ที่แตกต่างกัน และมันยากที่จะกำหนดคลาส Model สำหรับลักษณะไดนามิกนี้ (ฉันอาจผิด) .
มันทำงานได้อย่างถูกต้องหากมีการสร้างหน้าต่างโฮสติ้งใหม่ (และตั้งค่า DataContext) ทุกครั้งที่มีข้อมูลใหม่เข้ามา เนื่องจาก DataContext ของกล่องข้อความทั้งหมดจะมีข้อมูลใหม่ที่ได้มาสำหรับหน้าต่างโฮสติ้งใหม่
ไม่มีใครรู้วิธีรับกล่องข้อความ "รีเฟรช" DataContext เพื่อใช้ชุดใหม่บนหน้าต่างหลักและ "รีเฟรช" การเชื่อมโยงหรือไม่