Текстовое поле в списке - обновить источник и переместить фокус на вкладку, не работающую одновременно

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

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

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

Если я установлю 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" >

person Relativity    schedule 17.10.2011    source источник


Ответы (1)


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

ИЗМЕНИТЬ

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

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

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

person Rohit Vats    schedule 17.10.2011
comment
Я делаю это, используя прикрепленное свойство, которое будет принимать клавишу Enter в качестве ввода. - person Relativity; 17.10.2011
comment
Прежде всего, UpdateSourceTrigger не должен влиять на вкладки пользовательского интерфейса. И во-вторых, когда вы хотите, чтобы ваш источник обновлялся? В случае нажатия клавиши ввода, вы проверили, что ваш код для прикрепленного свойства вызывается, поставив там точку останова? Будет полезно, если вы сможете вставить свой код сюда. - person Rohit Vats; 17.10.2011
comment
Я добавил код. И я проверил, приходит ли управление, поставив в нем точку останова. - person Relativity; 17.10.2011
comment
Это помогает ... спасибо за вашу помощь. Но моя проблема с фокусом на вкладке все еще существует. - person Relativity; 17.10.2011
comment
Но вы сказали, что когда вы устанавливаете UpdateSourceTrigger как явное, проблема с вкладкой решается. С какой проблемой вы столкнулись сейчас? - person Rohit Vats; 17.10.2011
comment
У меня есть lisview с одним столбцом (с именем приоритета) в качестве редактируемого текстового поля. 1.) Если пользователь изменит один приоритет и нажмет клавишу ввода, измените приоритеты. 2.) Если пользователь нажимает «вкладку», чтобы потерять фокус, a-> если пользователь изменил один приоритет, измените порядок приоритетов (как в случае клавиши Enter) ... и перейдите к следующему текстовому полю приоритета (или следующему фокусируемому элементу управления) b-> Если пользователь не изменил никакого приоритета, просто перейдите к следующему текстовому полю приоритета (или к следующему элементу управления с фокусом) - person Relativity; 18.10.2011