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 中输入一些文本
  • 选择第二个标签
  • 选择第一个选项卡:在第一个选项卡的TextBox中输入的文字消失了(因为没有应用绑定)

另一种情况:

  • 选择第一个选项卡
  • 在第一个 TextBox 中输入一些文本
  • 选择第二个文本框(或任何改变焦点的东西,除了改变标签)
  • 选择第二个标签
  • 选择第一个选项卡:输入的文本仍然显示(因为应用了绑定)

这是正常行为吗?还是我做错了什么?谢谢你。

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。这样我就不必将 UpdateSourceTrigger=PropertyChanged 添加到我的选项卡中的每个 TextBox 中。我还避免每次按键都更新视图模型。

这是此处提到的解决方案的派生。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 回答