如何在GotFocus事件触发时使用MVVMPattern验证输入字段?

时间:2013-04-03 08:22:07

标签: c# wpf mvvm

我有以下视图

enter image description here

当TextBox2获得焦点时,我必须检查TextBox1是否为空。如果TextBox为空,我必须提示带消息框的消息。

3 个答案:

答案 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人,以供参考。古德勒克!