0

リストビューがあります。私は次のintを設定しました:-

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

リストビューの1つの列には、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" >
4

1 に答える 1

1

UpdateSourceTriggerを明示的に設定する場合、BindingExpressionでメソッドUpdateSourceを明示的に呼び出して、ソースを更新する必要があります。そのためのコードはどこにありますか?

編集

TextBoxKeyUpイベントでは、Escキーを押してテキストを設定することにより、バインディングを上書きしています。最初にそれをプロパティValueにバインドし、後でTextbox textプロパティをString.Emptyに明示的に設定します。このようにして、textプロパティはバインドを失います。したがって、後でUpdateSourceを呼び出すと、textboxのTextプロパティにバインドされなくなるため、Source値に伝播されません。代わりに、次のようにテキストを設定する必要があります-

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

このようにして、バインディングが保持され、UpdateSourceが正常に機能します。

于 2011-10-17T17:26:45.930 に答える