首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UpdateSourceTrigger=Explicit

UpdateSourceTrigger=Explicit
EN

Stack Overflow用户
提问于 2012-01-10 23:02:44
回答 4查看 35.8K关注 0票数 15

我正在创建一个有多个文本框的WPF窗口,当用户按下OK按钮时,我希望所有的文本框都被评估为非空白。我知道我必须使用带有'UpdateSourceTrigger of 'Explicit‘的TextBoxes,但是我需要为它们调用'UpdateSource()’吗?例如:

代码语言:javascript
运行
复制
<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" />

..。

代码语言:javascript
运行
复制
BindingExpression be = tbDefinitionFolder.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
BindingExpression be2 = tbReleaseFolder.GetBindingExpression(TextBox.TextProperty);
be2.UpdateSource();
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-11 00:04:25

另一种方法是将UpdateSourceTrigger设置为PropertyChanged。

然后从INotifyPropertyChanged和IDataErrorInfo继承您的VM。这里有一个例子..。

代码语言:javascript
运行
复制
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应该是...

代码语言:javascript
运行
复制
 <TextBox DataContext="{StaticResource Vm}" Text="{Binding MyProperty,
                UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, 
                NotifyOnSourceUpdated=True, Mode=TwoWay}" Width="200" Height="25"/>
票数 5
EN

Stack Overflow用户

发布于 2012-01-10 23:33:58

如果您使用Explicit,则需要调用UpdateSource

我不确定这是否是你尝试做的最好的方法,但是,我几乎从来不使用Explicit,如果我不想立即应用更改,我宁愿绑定到对象的副本,或者如果要取消编辑,我会存储副本并恢复所有内容。

票数 8
EN

Stack Overflow用户

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8805375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档