Kami memiliki aplikasi klien-server yang memiliki persyaratan untuk membangun Tampilan secara dinamis. Server akan mengirimkan string XAML bersama dengan data (string Dctionary‹, string>) ke klien, yang kemudian akan membangun Tampilan dari string Xaml yang diterima dan mengikat data ke Tampilan.
Berikut ini contoh string 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>
Datanya akan terlihat seperti:
new Dictionary<string, string>
{
{"ID_Id", "1"},
{"ID_Name", "John"}
};
Klien akan membangun Tampilan dengan menggunakan XamlReader.Load(), dan membuat Jendela untuk menampungnya sebagai Konten. Klien juga menugaskan data yang diterima ke Window.DataContext
window.DataContext = dictionaryData;
Karena kedua TextBox mewarisi DataContext dari Window, properti Text mengikat Kamus. Konverter pengikatan "fieldBindingConverter" mengambil nilai yang benar dari kamus dengan menggunakan ConverterParameter yang memiliki kuncinya.
Jadi Dua Kotak Teks akan menampilkan "1" dan "John" secara bersamaan ketika Tampilan pertama kali dibuat.
Masalah muncul ketika data baru tiba di sisi klien
new Dictionary<string, string>
{
{"ID_Id", "2"},
{"ID_Name", "Peter"}
};
Dengan mereset DataContext dari Window hosting tidak akan membuat pengikatan pada TextBox menyegarkan dirinya sendiri
window.DataContext = newDictionaryData;
Faktanya DataContext dari TextBox masih menyimpan nilai data lama.
Tampaknya TextBox hanya mengambil salinan DataContext induknya saat pertama kali diinisialisasi, dan kemudian hanya berfungsi dengan salinan lokal tersebut setelahnya.
Tampaknya juga tidak mudah untuk memiliki ViewModel dan mengimplementasikan INotifyPropertyChanged dalam skenario ini, karena kunci "ID_XX" dapat bervariasi di antara Tampilan yang berbeda dan sulit untuk menentukan kelas Model untuk sifat dinamis ini (saya bisa saja salah) .
Ini berfungsi dengan benar jika Jendela hosting baru dibuat (dan DataContext diatur) setiap kali data baru tiba, karena DataContext dari semua TextBox akan memiliki data baru yang diperoleh untuk jendela hosting baru.
Adakah yang tahu cara membuat TextBox "menyegarkan" DataContext-nya untuk mengambil set baru di Jendela induk dan "menyegarkan" pengikatannya?