2011-10-17 9 views
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を設定した場合、タブが機能していますが、ソースは更新されません。

私を助けてください

EDIT以下

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 
    } 

は、それに添付プロパティを持つリストビュー/ 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

UpdateSourceTriggerを明示的に設定すると、BindingExpressionでUpdateSourceメソッドを明示的に呼び出して、ソースを更新する必要があります。そのコードはどこにありますか?あなたはEscapeキーの押しにテキストを設定することで、あなたのバインディングを上書きしているあなたのTextBoxKeyUpイベントで

EDIT

。最初にそれをプロパティValueにバインドし、後でテキストボックスのテキストプロパティをString.Emptyに明示的に設定します。この方法では、テキストプロパティはバインディングを緩めます。したがって、後でUpdateSourceを呼び出すたびに、SourceStyleのTextプロパティにバインドされていないため、UpdateSourceを呼び出すたびにSource値に伝播しません。代わりに、このようなテキストを設定する必要があります。

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

このようにして、バインディングは保持され、UpdateSourceは正しく動作します。

+0

私は入力として「Enterキー」をとる添付プロパティを使用しています。 – Relativity

+0

まず、UpdateSourceTriggerはUIタブに影響を与えてはいけません。第二に、あなたのソースを更新したいとき? Enterキーが押された場合には、あなたが接続されたプロパティのコードがそこにブレークポイントを置くことによって呼び出されることを確認しましたか?ここにそのコードを貼り付けることができれば助かります。 –

+0

私はコードを追加しました。そして、コントロールにブレークポイントを入れることでコントロールが来るかどうかを確認しました。 – Relativity

関連する問題