我们有一个客户端 - 服务器应用程序,它具有动态构建View的要求。服务器会将XAML字符串与数据(Dctionary < string,string>)一起发送到客户端,然后客户端将根据收到的Xaml字符串构建View并将数据绑定到View。刷新WPF中子控件的DataContext
下面是示例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;
由于从窗口两个TextBox的继承DataContext的,Text属性绑定到词典。 绑定转换器“fieldBindingConverter”通过使用具有密钥的ConverterParameter从字典中提取正确的值。
因此,当第一次构建View时,两个TextBox将相应地显示“1”和“John”。
的问题,当一个新数据到达客户端
new Dictionary<string, string>
{
{"ID_Id", "2"},
{"ID_Name", "Peter"}
};
通过重置托管窗口的DataContext的不会让出现在文本框的结合刷新自身
window.DataContext = newDictionaryData;
事实上, TextBox的DataContext仍旧缓存旧的数据值。
似乎TextBox只在第一次初始化时接受其父DataContext的一个副本,然后仅在此后使用该本地副本。
在这种情况下,看起来并不容易有一个ViewModel并实现INotifyPropertyChanged,因为关键“ID_XX”可以在不同视图中变化,并且它很难为这个动态性质定义Model类可能是错误的)。
如果每次新数据到达时都创建新的托管窗口(并设置DataContext),它会正常工作,因为所有TextBox的DataContext都将为新的托管窗口派生新数据。
有谁知道如何让文本框“刷新”其DataContext采取新的父窗口设置和“刷新”绑定?
如何以及何时更改窗口的DataContext? – Nitin
在新数据到达时由事件触发。 – wd113