1

我正在使用 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。

我怎么做?

4

0 回答 0