TextBox BindingExpression UpdateSourceTrigger = Явный - PullRequest
1 голос
/ 16 октября 2011

Требуется TextBox в шаблоне данных ListView для вызова набора либо LostFocus, либо клавиши ввода. Используется UpdateSourceTrigger = Явный и события для 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();
    } 

быть нулевым. Я пробовал ListView.SelectedValueProperty и ListView.SelectedPathProperty. Если он попытается выполнить tbExistingValue, то произойдет сбой с сообщением «не существует» и даже не скомпилируется. Как мне получить правильное BindingExpression ?? Спасибо.

Если я установлю UpdateSourceTrigger = LostFocus и удаляю обработчики событий, которые он вызывает, они устанавливаются правильно Там есть действующая двухсторонняя привязка. Я просто не могу получить действительную ссылку на BindingExpression (be), используя явное.

Отлично работает для TextBox прямо на странице (в ячейке сетки). 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();
    }

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Поскольку вы применяете привязку к Text DP вашего Textbox, вам нужно извлечь привязку оттуда только так -

private void tbExistingValue_LostFocus(object sender, RoutedEventArgs e)
{
   BindingExpression be = (sender as TextBox).GetBindingExpression(TextBox.TextProperty);
   be.UpdateSource();
}

Более того, вы не привязали ListView SelectedItem с каким-либо свойствомваша ViewModel.Чтобы получить привязку, она должна быть по крайней мере привязана к некоторому значению.Итак, вам следует привязать его к вашему FieldValueProperty, тогда вы не получите нулевое значение с вашим кодом на месте.

0 голосов
/ 19 ноября 2015

Вам не нужно использовать UpdateSourceTrigger для TextBox, используя событие LostFocus.Это функция по умолчанию.

Ответ здесь: https://msdn.microsoft.com/en-gb/library/system.windows.data.binding.updatesourcetrigger(v=vs.110).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...