2

私のアプリケーションには、次の TabControl があります。

<TabControl ItemsSource="{Binding MyItemsSource}"
            ContentTemplate="{StaticResource ResourceKey=MyContentTemplate}"
            IsSynchronizedWithCurrentItem="True" />

使用される ContentTemplate は次のとおりです。

<DataTemplate x:Key="MyContentTemplate">
    <Canvas>
        <TextBox Text="{Binding Path=MyFirstText, Mode=TwoWay}" />
        <TextBox Text="{Binding Path=MySecondText, Mode=TwoWay}" />
    </Canvas>
</DataTemplate>

そしてItemsSource:

public ObservableCollection<MyData> MyItemsSource { get; set; }

public class MyData
{
    public string MyFirstText { get; set; }
    public string MySecondText { get; set; }
}

次のシナリオを検討してください。

  • 最初のタブを選択
  • 最初の TextBox にテキストを入力します
  • 2 番目のタブを選択します
  • 最初のタブを選択: 最初のタブの TextBox に入力されたテキストが消えた (バインディングが適用されていないため)

別のシナリオ:

  • 最初のタブを選択
  • 最初の TextBox にテキストを入力します
  • 2番目のTextBoxを選択します(または、タブを変更する以外にフォーカスを変更するもの)
  • 2 番目のタブを選択します
  • 最初のタブを選択: 入力したテキストは引き続き表示されます (バインディングが適用されたため)。

それは正常な動作ですか?それとも私は何か間違ったことをしていますか?ありがとうございました。

4

3 に答える 3

2

TextBox の更新トリガーがデフォルトで LostFocus に設定されているために発生します。それを PropertyChanged に変更すると、動作するはずです。

<TextBox Text="{Binding Path=MyFirstText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

UpdateSourceTrigger: http://msdn.microsoft.com/en-us/library/system.windows.data.updatesourcetrigger.aspx

于 2013-08-12T12:38:01.523 に答える
1

タブを切り替えるときに、フォーカスされた要素と OnLostFocus イベントが発生しないことに関連している可能性があります。次のように UpdateSourceTriger 属性を使用してバインディングを変更してみてください。

<DataTemplate x:Key="MyContentTemplate">
    <Canvas>
        <TextBox Text="{Binding Path=MyFirstText, UpdateSourceTrigger=PropertyChanged}" />
        <TextBox Text="{Binding Path=MySecondText, UpdateSourceTrigger=PropertyChanged}" />
    </Canvas>
</DataTemplate>

また、wpf では双方向モードがデフォルトであるため、双方向モードを指定する必要はありません。

于 2013-08-12T12:38:26.853 に答える
0

問題は、タブを変更するときに LostFocus が起動されないことです。前述のように UpdateSourceTrigger を PropertyChanged に変更できますが、TabControl を拡張して LostFocus を手動で起動することをお勧めします。このように、タブ内のすべての TextBox に UpdateSourceTrigger=PropertyChanged を追加する必要はありません。また、キーを押すたびにビューモデルを更新することも避けています。

これは、ここで説明したソリューションの派生物です。WPF: 新しいタブが選択されたときにデータ バインドされた TabControl が変更をコミットしない

public class SmartTabControl : TabControl
{
    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if (Keyboard.FocusedElement is TextBox)
            Keyboard.FocusedElement.RaiseEvent(new RoutedEventArgs(LostFocusEvent));

        base.OnSelectionChanged(e);
    }
}
于 2014-12-26T19:40:50.183 に答える