我有以下看法如何在GotFocus事件觸發時使用MVVMPattern驗證輸入字段?
我要檢查TextBox1的是空的或不是當TextBox2中越來越關注的焦點。如果TextBox是空的,我必須用消息框提示消息。
我有以下看法如何在GotFocus事件觸發時使用MVVMPattern驗證輸入字段?
我要檢查TextBox1的是空的或不是當TextBox2中越來越關注的焦點。如果TextBox是空的,我必須用消息框提示消息。
處理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();
}
}
我不明白你的答案爲什麼因爲我是新手mvvm模式,請給我的代碼。 –
@ASHOKA:請參閱我對上述問題的評論。 – Dennis
我認爲有可能創建附加屬性以避免後面的代碼像private void TextBox_GotFocus(object sender,RoutedEventArgs e) var bindingExpression = Text1.GetBindingExpression(TextBox.TextProperty); bindingExpression.UpdateSource(); }。但我不知道如何實現這一點。 –
您可以掛鉤一個命令一個事件來執行這一個WPF MVVM實現的應用程序。檢查這link男子供您參考。祝你好運!
ViewModel應該爲其屬性提供一些驗證錯誤。見System.ComponentModel.IDataErrorInfo
。在MVVM中,視圖取決於其視圖模型是沒有問題的。 CodeBehind中的代碼本身並不壞,只應該經過深思熟慮。
我也認爲如果你使用MVVM,你應該爲字段驗證實現IDataErrorInfo。 –
您可以使用TextBox1的「LostFocus」事件。 – Haritha
沒有代碼。我必須用MVVM Pattern –
OK來實現這個場景。然後你可以在你的視圖模型中定義一個'command',然後將它綁定到'event'。請看這個[示例](http://stackoverflow.com/a/15201785/873979) – Haritha