UpdateSourceTrigger有三个枚举,
第一个是Explicit,源不会更新除非你手动来操作。正因为这个原因,我在这个TextBox旁边添加了一个按钮,用于手动更新源。在后台代码中,我们看到点击事件处理方法里面只有两行代码,第一行获取目标控件的绑定,第二行调用UpdateSource()方法。
第二是LostFocus,对于Text绑定来说其实就是一个默认值。也就是说一旦目标控件失去焦点,源就会被更新。
第三是PropertyChanged,一旦绑定的属性值改变,源会立即更新。本例中文本改变就产生这种效果。
绑定的UpdateSourceTrigger属性用来控制改变的值何时传递给源。
例如下边这个代码,如果不指定,checkbox的值不会传到后台。
<DataGrid.Columns>
<DataGridTemplateColumn Width="1.2*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding
IsCheck,Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}">
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="编号" Binding="{Binding Num}" Width="1*"/>
<DataGridTextColumn Header="项目名称" Binding="{Binding NAME}" Width="6*"/>
</DataGrid.Columns>
另外也可以正对checkbox定义事件
<DataGridTemplateColumn
Width="10*"
MinWidth="60"
Header="操作" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox Style="{StaticResource CheckBoxStyle}" HorizontalAlignment="Center"
IsChecked="{Binding Ischeck,Mode= TwoWay, UpdateSourceTrigger=PropertyChanged}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction Command="{Binding DataContext.CheckStateChangeCmd,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="true"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction Command="{Binding DataContext.CheckStateChangeCmd,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="false"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>