在TabControl中切换Tab时,TextBox绑定不起作用

时间:2015-11-05 11:28:26

标签: c# wpf tabcontrol

我在TabControl中有一个TextBox。如果我编辑框中的文本然后切换到另一个选项卡,文本将丢失。如果我更改焦点(通过键盘上的TAB键)然后切换到另一个选项卡,新文本将在我的视图模型中设置。

这是我的代码:

<Window x:Class="TabSwitchProblem.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<TabControl ItemsSource="{Binding Pages}">
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBox Text="{Binding PageContent}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

public partial class MainWindow : Window
{
    public ObservableCollection<PageViewModel> Pages
    {
        get { return (ObservableCollection<PageViewModel>)GetValue(PagesProperty); }
        set { SetValue(PagesProperty, value); }
    }
    public static readonly DependencyProperty PagesProperty =
        DependencyProperty.Register("Pages", typeof(ObservableCollection<PageViewModel>), typeof(MainWindow), new PropertyMetadata(null));

    public MainWindow()
    {
        InitializeComponent();
        Pages = new ObservableCollection<PageViewModel>();
        Pages.Add(new PageViewModel());
        Pages.Add(new PageViewModel());
        DataContext = this;
    }
}
public class PageViewModel : DependencyObject
{
    public string PageContent
    {
        get { return (string)GetValue(PageContentProperty); }
        set { SetValue(PageContentProperty, value); }
    }
    public static readonly DependencyProperty PageContentProperty =
        DependencyProperty.Register("PageContent", typeof(string), typeof(PageViewModel), new PropertyMetadata(null));
}

如何确保在我的viewmodel中更新文本?

3 个答案:

答案 0 :(得分:1)

如果希望绑定在每次值更改时更新目标,则应将UpdateSourceTrigger设置为PropertyChanged。默认情况下,UpdateSourceTrigger的{​​{1}}属性的TextTextBox,只有在焦点丢失后才会更新目标。

LostFocus

答案 1 :(得分:0)

您可能需要将48添加到UpdateSourceTrigger=LostFocus行。

代码应如下所示

<TextBox Text="{Binding PageContent}" />

这应该有效。

答案 2 :(得分:0)

先前接受的answer尽管有效,但涉及将文本框的绑定行为更改为UpdatesourceTrigger=PropertyChanged。对于某些用法的文本框或其他接受输入的控件,这可能是不可接受的。

一个简单的解决方法是在TabControl的SelectionChanged后面的代码中手动将焦点设置到控件上的另一个元素(或tabcontrol本身)上。这样,当前聚焦的输入元素实际上会失去焦点,从而触发绑定:

<TabControl x:Name="MyTabControl" SelectionChanged="MyTabControl_OnSelectionChanged">
private void MyTabControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    MyTabControl.Focus();
}