我正在创建一个有多个文本框的WPF窗口,当用户按下OK按钮时,我希望所有的文本框都被评估为非空白。我知道我必须使用带有'UpdateSourceTrigger of 'Explicit‘的TextBoxes,但是我需要为它们调用'UpdateSource()’吗?例如:
<TextBox Height="23"
HorizontalAlignment="Left"
Margin="206,108,0,0"
Text="{Binding Path=Definition, UpdateSourceTrigger=Explicit}"
Name="tbDefinitionFolder"
VerticalAlignment="Top"
Width="120" />
<TextBox Height="23"
HorizontalAlignment="Left"
Margin="206,108,0,0"
Text="{Binding Path=Release, UpdateSourceTrigger=Explicit}"
Name="tbReleaseFolder"
VerticalAlignment="Top"
Width="120" />
..。
BindingExpression be = tbDefinitionFolder.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
BindingExpression be2 = tbReleaseFolder.GetBindingExpression(TextBox.TextProperty);
be2.UpdateSource();
发布于 2012-01-11 00:04:25
另一种方法是将UpdateSourceTrigger设置为PropertyChanged。
然后从INotifyPropertyChanged和IDataErrorInfo继承您的VM。这里有一个例子..。
public class MyViewModel : INotifyPropertyChanged, IDataErrorInfo
{
private string myVar;
public string MyProperty
{
[DebuggerStepThrough]
get { return myVar; }
[DebuggerStepThrough]
set
{
if (value != myVar)
{
myVar = value;
OnPropertyChanged("MyProperty");
}
}
}
private void OnPropertyChanged(string prop)
{
if(PropertyChanged!=null)
{
PropertyChanged(this, new PropertyChangedEventArgs(pro));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public string Error
{
get { return String.Empty; }
}
public string this[string columnName]
{
get
{
if (columnName == "MyProperty")
{
if (String.IsNullOrEmpty(MyProperty))
{
return "Should not be blank";
}
}
return null;
}
}
}
假设您的一个TextBoxes绑定到了上面声明的'MyProperty‘。索引器是在IDataErrorInfo中实现的,当'MyProperty‘改变时会被调用。在索引器主体中,您可以检查该值是否为空,并返回错误字符串。如果错误字符串不为空,用户将在TextBox上获得一个很好的装饰器作为视觉提示。因此,您可以在一个镜头中执行验证并提供UI体验。
如果您使用上面编码的两个接口并使用UpdateSourceTrigger=PropertyChanged,那么所有这些都是免费的。使用UpdateSourceTrigger = Explicit对于提供您所描述的验证来说过于夸张了。
TextBox的Xaml应该是...
<TextBox DataContext="{StaticResource Vm}" Text="{Binding MyProperty,
UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True,
NotifyOnSourceUpdated=True, Mode=TwoWay}" Width="200" Height="25"/>
发布于 2012-01-10 23:33:58
如果您使用Explicit
,则需要调用UpdateSource
。
我不确定这是否是你尝试做的最好的方法,但是,我几乎从来不使用Explicit
,如果我不想立即应用更改,我宁愿绑定到对象的副本,或者如果要取消编辑,我会存储副本并恢复所有内容。
发布于 2017-02-14 22:38:34
有一些很好的理由使用UpdateSourceTrigger=Explicit,而不是其他值。假设您必须检查输入的值是否唯一,这将通过读取数据库来完成。这可能需要一些时间,即使是0.3秒也是不可接受的。使用PropertyChanged时,每次用户按键时都会执行此数据库检查,这会使用户界面非常不响应。如果UpdateSourceTrigger=LostFocus和用户在控件之间快速切换,也会发生同样的事情(如果你按住Tab键,控件之间会有闪电般的快速循环)。因此,我们的目标是在关键时刻(通常在数据保存之前)一次性验证所有内容。这种方法需要最少的后台代码,这将把数据从视图推送到视图模型并强制验证。代码背后没有验证代码或其他应用程序逻辑,因此MVVM纯粹主义者可以相对平静。我用VB.NET创建了一个全功能的例子,它使用了Caliburn.Micro for MVVM和IoC。你可以在这里下载:https://drive.google.com/file/d/0BzdqT0dfGkO3OW5hcjdBOWNWR2M
https://stackoverflow.com/questions/8805375
复制相似问题