我有以下观点
当 TextBox2 获得焦点时,我必须检查 TextBox1 是否为空。如果文本框一个是空的,我必须用消息框提示一条消息。
为处理GotFocus
事件TextBox2
,找到TextBox1.Text
属性的绑定表达式,然后调用BindingExpression.UpdateSource
。
请注意,如果您想防止默认验证行为(失去焦点时) ,您应该设置UpdateSourceTrigger="Explicit"
为。TextBox1.Text
TextBox1
升级版。
代码示例(带有数据错误验证)。视图模型:
public class ViewModel : INotifyPropertyChanged, IDataErrorInfo
{
// INPC implementation is omitted
public string Text1
{
get { return text1; }
set
{
if (text1 != value)
{
text1 = value;
OnPropertyChanged("Text1");
}
}
}
private string text1;
public string Text2
{
get { return text2; }
set
{
if (text2 != value)
{
text2 = value;
OnPropertyChanged("Text2");
}
}
}
private string text2;
#region IDataErrorInfo Members
public string Error
{
get { return null; }
}
public string this[string columnName]
{
get
{
if (columnName == "Text1" && string.IsNullOrEmpty(Text1))
return "Text1 cannot be empty.";
return null;
}
}
#endregion
}
风景:
<Window x:Class="WpfApplication4.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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Margin="5" Name="Text1" Text="{Binding Text1, ValidatesOnDataErrors=True, UpdateSourceTrigger=Explicit}"/>
<TextBox Grid.Row="1" Margin="5" Text="{Binding Text2, ValidatesOnDataErrors=True}" GotFocus="TextBox_GotFocus" />
</Grid>
</Window>
代码隐藏:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
var bindingExpression = Text1.GetBindingExpression(TextBox.TextProperty);
bindingExpression.UpdateSource();
}
}
ViewModel 应该为其属性提供一些验证错误。见System.ComponentModel.IDataErrorInfo
。在 MVVM 中,如果视图依赖于它的视图模型是没有问题的。CodeBehind 中的代码本身并不坏,它应该是经过深思熟虑的。
您可以将命令连接到事件以对 WPF MVVM 实现的应用程序执行此操作。检查此链接man 以供参考。祝你好运!