代码之家  ›  专栏  ›  技术社区  ›  jpsstavares

OnPropertyChanged上的WPF文本框值没有更改

  •  6
  • jpsstavares  · 技术社区  · 16 年前

    我有一个文本框,其值绑定到ViewModel属性:

            <TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding Mode=TwoWay, Path=RunAfter}" Style="{StaticResource TestStepTextBox}"/>
    

    设置和获取工作正常,直到我尝试在设置值时添加一些验证:

        private int _runAfter = 0;
        public string RunAfter
        {
            get
            {
                return _runAfter.ToString();
            }
    
            set
            {
                int val = int.Parse(value);
    
                if (_runAfter != val)
                {
                    if (val < _order)
                        _runAfter = val;
                    else
                    {
                        _runAfter = 0;
                        OnPropertyChanged("RunAfter");
                    }
                }
            }
        }
    

    虽然已到达OnPropertyChanged(我对此有怀疑),但视图没有更改。 我怎样才能做到这一点?

    谢谢, 约瑟夫

    3 回复  |  直到 15 年前
        1
  •  5
  •   Abe Heidebrecht    16 年前

    问题是您正在更新 Binding 结合 正在更新您的属性。当wpf提升 PropertyChanged 响应事件 结合 更新。您可以使用 Dispatcher 要延迟事件在该分支中的传播:

    set
    {
        int val = int.Parse(value);
    
        if (_runAfter != val)
        {
            if (val < _order)
            {
                _runAfter = val;
                OnPropertyChanged("RunAfter");
            }
            else
            {
                _runAfter = 0;
                Dispatcher.CurrentDispatcher.BeginInvoke(
                    new Action<String>(OnPropertyChanged), 
                    DispatcherPriority.DataBind, "RunAfter");
            }
        }
    }
    

    更新:

    我注意到的另一件事是 结合 对你 TextBox 正在使用默认值 UpdateSourceTrigger 文本框 失去焦点。在 文本框 在这种模式下失去焦点。如果你把它改成 属性更改 ,您将看到这种情况立即发生。否则,在您的 文本框 失去焦点:

    <TextBox Name="txtRunAfter" Grid.Column="4" Text="{Binding RunAfter, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TestStepTextBox}"/>
    
        2
  •  3
  •   Eric Olsson    16 年前

    我在这里注意到的一些事情。

    除非您有一个令人信服的理由将runafter属性公开为字符串,否则没有理由不能是in t。这样可以将强制转换保存在setter中(如果用户在字段中输入非整数,则可能隐藏invalidcastexception)。

    其次,onPropertyChanged()调用应在内部if语句之外发生,如下所示:

    if(_runAfter != val)
    {
        if(val < _order)
            _runAfter = val;
        else
            _runAfter = 0;
        OnPropertyChanged("RunAfter");
    }
    

    由于在条件的两个路径中都更新了_runafter local,因此无论采用何种分支,都必须调用onPropertyChanged()。我希望这能帮助你找到正确的方向!

        3
  •  1
  •   Horizon    15 年前

    我也有同样的情况。我写了以下内容,它起作用了。

    <TextBox Grid.Column="3" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Center" Width="100" Text="{Binding Path=FirstName}"></TextBox>

    public string FirstName
        {
            get { return _client.FirstName; }
            set
            {
                if (value == _client.FirstName)
                    return;
                else
                    _client.FirstName = value;
                OnPropertyChanged("FirstName");
            }
        }