C# 文本框绑定不';在TabControl中切换Tab时不工作

C# 文本框绑定不';在TabControl中切换Tab时不工作,c#,wpf,tabcontrol,C#,Wpf,Tabcontrol,我在TabControl中有一个文本框。如果编辑框中的文本,然后切换到另一个选项卡,则文本将丢失。如果我更改焦点(通过键盘上的TAB键),然后切换到另一个选项卡,则新文本将在我的viewmodel中设置 这是我的密码: <Window x:Class="TabSwitchProblem.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://s

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

这是我的密码:

<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>

公共部分类主窗口:窗口
{
公共可观察收集页面
{
get{return(ObservableCollection)GetValue(PagesProperty);}
set{SetValue(PagesProperty,value);}
}
公共静态只读从属属性页属性=
DependencyProperty.Register(“页面”、typeof(ObservableCollection)、typeof(MainWindow)、new PropertyMetadata(null));
公共主窗口()
{
初始化组件();
Pages=新的ObservableCollection();
添加(新的PageViewModel());
添加(新的PageViewModel());
DataContext=this;
}
}
公共类PageViewModel:DependencyObject
{
公共字符串页面内容
{
get{return(string)GetValue(PageContentProperty);}
set{SetValue(PageContentProperty,value);}
}
公共静态只读从属属性PageContentProperty=
Register(“PageContent”、typeof(string)、typeof(PageViewModel)、newpropertyMetadata(null));
}

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

您可能需要在
行中添加
UpdateSourceTrigger=LostFocus

代码应该是这样的

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=LostFocus}" />


这应该行。

您可能需要在
行中添加
UpdateSourceTrigger=LostFocus

代码应该是这样的

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=LostFocus}" />


这应该行。

如果希望绑定在每次值更改时都更新目标,则应将
UpdateSourceTrigger
设置为
PropertyChanged
。默认情况下,
TextBox
UpdateSourceTrigger
属性
LostFocus
,仅在焦点丢失后更新目标

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=PropertyChanged}" />

如果希望绑定在每次值更改时更新目标,则应将
更新资源记录器
设置为
属性更改
。默认情况下,
TextBox
UpdateSourceTrigger
属性
LostFocus
,仅在焦点丢失后更新目标

<TextBox Text="{Binding PageContent, UpdateSourceTrigger=PropertyChanged}" />

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

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

<TabControl x:Name="MyTabControl" SelectionChanged="MyTabControl_OnSelectionChanged">
以前接受的方法虽然有效,但涉及将文本框的绑定行为更改为
UpdatesourceTrigger=PropertyChanged
。对于textbox或其他输入接受控件的某些用法,这可能是不可接受的

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

<TabControl x:Name="MyTabControl" SelectionChanged="MyTabControl_OnSelectionChanged">

捕获选项卡索引已更改并通知您的模型属性?我知道如何捕获SelectionChanged事件。但是你通知我的模特是什么意思?如何获取文本框中的值并在模型中设置它?捕获选项卡索引更改并通知您的模型属性?我知道,如何捕获SelectionChanged事件。但是你通知我的模特是什么意思?如何在文本框中获取值并在模型中进行设置?这很有效。但是它有一个副作用,它会在每次按键时触发。这是
PropertyChanged
的预期行为,不是副作用。我理解这一点,但当用户单击另一个选项卡时,我正在寻找更新我的属性的方法。我不想每按一次键都更新。所以对于我的问题,这是一个有副作用的解决办法。但在这种特殊情况下,这是我可以接受的副作用。我同意@MTR。我刚刚添加了一个解释如何在不更改触发器的情况下强制更新的命令。这很有效。但是它有一个副作用,它会在每次按键时触发。这是
PropertyChanged
的预期行为,不是副作用。我理解这一点,但当用户单击另一个选项卡时,我正在寻找更新我的属性的方法。我不想每按一次键都更新。所以对于我的问题,这是一个有副作用的解决办法。但在这种特殊情况下,这是我可以接受的副作用。我同意@MTR。我刚刚添加了一个解释如何在不更改触发器的情况下强制更新的命令。很抱歉,应该更改属性而不是丢失焦点。我从我所做的事情中复制了代码。对不起,它应该被属性更改而不是丢失焦点。我从我所做的事情中复制了代码。