Textbox in listview - обновлять источник и перемещать фокус на вкладку, не работающую одновременно - PullRequest
0 голосов
/ 17 октября 2011

У меня есть список.Я установил следующее int, что: -

<ListView KeyboardNavigation.TabNavigation="Local" SelectionMode="Extended">
 <ListView.ItemContainerStyle>
  <Style>
     <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
  </Style>
</ListView.ItemContainerStyle>

Один столбец в списке содержит TextBox's.

Если я установлю UpdateSourceTrigger = LostFocus в своем текстовом поле, я не смогу перемещаться по списку ... Вместо этого, если я установил UpdateSourceTrigger = Explicit, вкладка будет работать ... но источник не будет обновляться.

Пожалуйста, помогите мне

РЕДАКТИРОВАТЬ

public class TextBoxBehavior
    {
        #region Attached Property EscapeClearsText


        public static readonly DependencyProperty EscapeClearsTextProperty
           = DependencyProperty.RegisterAttached("EscapeClearsText", typeof(bool), typeof(TextBoxBehavior),
                new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnEscapeClearsTextChanged)));


        private static void OnEscapeClearsTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if ((bool)e.NewValue)
            {
                var textBox = d as TextBox;
                if (textBox != null)
                {
                    textBox.KeyUp -= TextBoxKeyUp;
                    textBox.KeyUp += TextBoxKeyUp;
                }
            }
        }


        private static void TextBoxKeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Escape)
            {
                //((DataContext<string>)((TextBox)sender).GetBindingExpression(TextBox.TextProperty).DataItem).RollbackChanges();
                ((TextBox)sender).Text = string.Empty;
            }
            else if (e.Key == Key.Enter)
            {                
                ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource();
                                }
        }

        public static void SetEscapeClearsText(DependencyObject dependencyObject, bool escapeClearsText)
        {
            if (!ReferenceEquals(null, dependencyObject))
                dependencyObject.SetValue(EscapeClearsTextProperty, escapeClearsText);
        }


        public static bool GetEscapeClearsText(DependencyObject dependencyObject)
        {
            if (!ReferenceEquals(null, dependencyObject))
                return (bool)dependencyObject.GetValue(EscapeClearsTextProperty);
            return false;
        }


        #endregion Attached Property EscapeClearsText
    }

Ниже приведен столбец listview / gridview с вложенным свойством.

 <GridViewColumn  Width="60">
                                            <GridViewColumnHeader Content="Priority"
                                              Command="{Binding Path=SortSelectedClaimCodeGroupsCommand}"
                                              CommandParameter="Item.IntPriority">
                                            </GridViewColumnHeader>
                                            <GridViewColumn.CellTemplate>
                                                <DataTemplate>
                                                    <Border DataContext="{Binding Item.Priority}"
                                                        Style="{StaticResource ValidationResultBorderStyle}" HorizontalAlignment="Left" >
                                                        <TextBox Width="200" MaxLength="25" Text="{Binding Path=Value,Mode=TwoWay,                         
                                                            UpdateSourceTrigger=Explicit}" local:TextBoxBehavior.EscapeClearsText="True" >

1 Ответ

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

Когда вы устанавливаете UpdateSourceTrigger как явный, вы должны обновить источник, явно вызвав метод UpdateSource для вашего BindingExpression. Где код для этого?

EDIT

В вашем событии TextBoxKeyUp вы перезаписываете свою привязку, устанавливая текст нажатием клавиши Escape. Сначала вы связываете его со свойством Value, а затем явно устанавливаете текстовое свойство Textbox равным String.Empty. Таким образом, текстовое свойство теряет свою привязку. Поэтому позже, когда вы вызываете UpdateSource, он не будет распространяться на значение Source, поскольку он больше не привязан к свойству Text текстового поля. Вместо этого вы должны установить текст следующим образом -

((TextBox)sender).SetCurrentValue(TextBox.TextProperty, String.Empty);

Таким образом, ваша привязка будет сохранена, и UpdateSource будет работать как надо.

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