2013-04-03 69 views
1

我有以下看法如何在GotFocus事件觸發時使用MVVMPattern驗證輸入字段?

enter image description here

我要檢查TextBox1的是空的或不是當TextBox2中越來越關注的焦點。如果TextBox是空的,我必須用消息框提示消息。

+0

您可以使用TextBox1的「LostFocus」事件。 – Haritha

+0

沒有代碼。我必須用MVVM Pattern –

+0

OK來實現這個場景。然後你可以在你的視圖模型中定義一個'command',然後將它綁定到'event'。請看這個[示例](http://stackoverflow.com/a/15201785/873979) – Haritha

回答

1

處理GotFocus事件TextBox2,找到TextBox1.Text屬性的綁定表達式,並調用BindingExpression.UpdateSource

請注意,如果要防止默認驗證行爲(當TextBox1失去焦點時),您應該爲TextBox1.Text設置UpdateSourceTrigger="Explicit"

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(); 
    } 
} 
+0

我不明白你的答案爲什麼因爲我是新手mvvm模式,請給我的代碼。 –

+0

@ASHOKA:請參閱我對上述問題的評論。 – Dennis

+0

我認爲有可能創建附加屬性以避免後面的代碼像private void TextBox_GotFocus(object sender,RoutedEventArgs e) var bindingExpression = Text1.GetBindingExpression(TextBox.TextProperty); bindingExpression.UpdateSource(); }。但我不知道如何實現這一點。 –

0

您可以掛鉤一個命令一個事件來執行這一個WPF MVVM實現的應用程序。檢查這link男子供您參考。祝你好運!

1

ViewModel應該爲其屬性提供一些驗證錯誤。見System.ComponentModel.IDataErrorInfo。在MVVM中,視圖取決於其視圖模型是沒有問題的。 CodeBehind中的代碼本身並不壞,只應該經過深思熟慮。

+0

我也認爲如果你使用MVVM,你應該爲字段驗證實現IDataErrorInfo。 –

相關問題