我正在使用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都会更新绑定源。
我该怎么做?