我在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中更新文本?
答案 0 :(得分:1)
如果希望绑定在每次值更改时更新目标,则应将UpdateSourceTrigger
设置为PropertyChanged
。默认情况下,UpdateSourceTrigger
的{{1}}属性的Text
为TextBox
,只有在焦点丢失后才会更新目标。
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();
}