需要 ListView DataTemplate 中的 TextBox 来调用 LostFocus 上的 set 或输入键。使用 UpdateSourceTrigger = Explicit 和 LostFocus 和 KeyUp 的事件。问题是我无法获得对 BindingExpression 的有效引用。
XAML
<ListView x:Name="lvMVitems" ItemsSource="{Binding Path=DF.DocFieldStringMVitemValues, Mode=OneWay}">
<ListView.View>
<GridView>
<GridViewColumn x:Name="gvcExistingValue">
<GridViewColumnHeader Content="Value"/>
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="tbExistingValue"
Text="{Binding Path=FieldItemValue, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True, UpdateSourceTrigger=Explicit}"
Validation.Error="Validataion_Error"
LostFocus="tbExistingValue_LostFocus" KeyUp="tbExistingValue_KeyUp" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
代码不工作
private void tbExistingValue_LostFocus(object sender, RoutedEventArgs e)
{
BindingExpression be = lvMVitems.GetBindingExpression(ListView.SelectedItemProperty);
be.UpdateSource();
}
be 为空。我试过 ListView.SelectedValueProperty 和 ListView.SelectedPathProperty。如果它尝试 tbExistingValue 它会失败并显示“不存在”消息,甚至不会编译。如何获得正确的 BindingExpression?谢谢。
如果我设置 UpdateSourceTrigger = LostFocus 并删除它确实调用设置正确的事件处理程序。那里有一个有效的双向绑定。我只是无法使用显式获得对 BindingExpression (be) 的有效引用。
它适用于直接在页面上的文本框(在网格单元中)。下面的 xaml 有效:
<TextBox Grid.Row="1" Grid.Column="1" x:Name="strAddRow"
Text="{Binding Path=DF.NewFieldValue, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True, UpdateSourceTrigger=Explicit}"
Validation.Error="Validataion_Error"
LostFocus="strAddRow_LostFocus" KeyUp="strAddRow_KeyUp"/>
此 BindingExpression 工作正常:
private void strAddRow_LostFocus(object sender, RoutedEventArgs e)
{
BindingExpression be = strAddRow.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
}