我有以下视图
当TextBox2获得焦点时,我必须检查TextBox1是否为空。如果TextBox为空,我必须提示带消息框的消息。
答案 0 :(得分:1)
处理TextBox2
的{{3}}事件,找到TextBox1.Text
属性的绑定表达式,然后调用GotFocus
。
请注意,如果要阻止默认验证行为(UpdateSourceTrigger="Explicit"
失去焦点时),则应为TextBox1.Text
设置TextBox1
。
<强> UPD 强>
代码示例(带有数据错误验证)。 视图模型:
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();
}
}
答案 1 :(得分:1)
ViewModel应该为其属性提供一些验证错误。见System.ComponentModel.IDataErrorInfo
。在MVVM中,如果视图依赖于其viewmodel,则没有问题。 CodeBehind中的代码本身并不坏,它应该只是经过深思熟虑。
答案 2 :(得分:0)
您可以将命令连接到事件,以便对WPF MVVM实现的应用程序执行此操作。请查看此link人,以供参考。古德勒克!