我正在使用 DataTemplateSelector 根据用户是要输入文本还是选择日期值来交换用户的输入法。这意味着选择器在 TextBox 和 DatePicker 之间切换。每个控件都必须使用显式的方式来更新绑定源。总而言之,用户可以选择一个日期,或者他可以输入一个文本,一旦他完成了,他可以点击应用按钮来更新源。虽然只有应用按钮更新源而不是焦点丢失。
DataTemplateSelector 的所有者控件是一个名为 InputControl 的自定义 ContentControl,它是 UserControl 的一部分。
这是一小段伪代码,只是为了更好地可视化事物:
public class InputControl : ContentControl
{
//// this method shall be executed once user clicks on apply button
//// inside this method the source of binding shall be updated no matter what input method used chose
public void Update()
{
}
}
Xaml 看起来有点像这样:
<UserControl>
<UserControl.Resources>
<DataTemplate x:key="text">
<TextBox Text="{Binding Mode=TwoWay, Path=., UpdateSourceTrigger=Explicit}"/>
</DataTemplate>
<DataTemplate x:key="date">
<DatePicker DateValue="{Binding Mode=TwoWay, Path=., UpdateSourceTrigger=Explicit}"/>
</DataTemplate>
<MyDataTemplateSelector x:key="myDataTemplateSelector"
TextTemplate="{StaticResource text}"
DateTemplate="{StaticResource date}">
</MyDataTemplateSelector>
</UserControl.Resources>
<Inputcontrol Content="{Binding Path=., Mode=TwoWay}" ContentTemplateSelector="{StaticResource myDataTemplateSelector}" />
</UserControl>
选择器看起来像这样
Public class MyDataTemplateSelector : DataTemplateSelector
{
Public DataTemplate TextTemplate { get; set;}
Public DataTemplate DateTemplate { get; set;}
Public DataTDemplate Select(.....)
{
....
}
}
现在的问题是,无论在模板中选择什么控件,我如何从 InputControl 更新绑定源?如果您阅读了 InputControl.Update() 方法上方的注释,您将更好地理解我对用户更新源的含义,无论是什么模板。
如果它的 TextBox 被选中,用户应该能够调用 InputControl.Update() 并且它将更新文本框绑定源。如果它的 DatePicker 用户应该能够执行相同的操作,只需调用 InputControl.Update()。源将得到更新,并且 Inputcontrol.Update() 是触发更新过程的中心点,无论何种控制。
总而言之,Update() 方法非常重要,它更新绑定源,无论它是 TextBox 还是 DatePicker。
我怎么做?