wpf 当模式设置为单向时,绑定对象被清除-与双向一起工作正常

xggvc2p6  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(173)

我有一个简单的WPF弹出控件。我想显示弹出时,用户在文本框中输入错误的年龄。
我的代码段

<TextBox Name="TxtAge"  LostFocus="TxtAge_OnLostFocus" ></TextBox>
<Popup Name="InvalidAgePopup" IsOpen="{Binding IsAgeInvalid, Mode=OneWay}"/>

代码隐藏

private void TxtAge_OnLostFocus(object sender, RoutedEventArgs e)
{
        var text = TxtAge.Text;
        double value = 0;
        if (Double.TryParse(text, out value))
        {
            vm.IsAgeInvalid = false;
        }
        else
        {
            vm.IsAgeInvalid = true;
        }
}

视图模型

public class AgeViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private bool _isAgeInvalid;
    public bool IsAgeInvalid
    {
        get { return _isAgeInvalid; }
        set
        {
            _isAgeInvalid = value;
            OnPropertyChanged();
        }
    }
}

在文本框中输入无效年龄时设置IsAgeInvalid属性。此时我希望显示弹出窗口。并且在关闭弹出窗口控件时不希望设置IsAgeInvalid = false。为此,我设置了Mode=OneWay IsOpen="{Binding IsAgeInvalid, Mode=OneWay}
当我输入错误的数据时,弹出窗口显示正常。当我关闭弹出窗口时,我的绑定对象正在被清除。下面的截图来自snoop工具。
绑定对象第一次出现时。

弹出窗口关闭后,绑定对象将被清除。

绑定部分在TwoWay模式下工作正常,我不希望IsAgeInvalid属性被设置为false,因为IsOpen被设置为false。我已经尝试设置UpdateSourceTriger和其他一些方法,在弹出窗口关闭后,绑定对象仍然被清除。

11dmarpk

11dmarpk1#

假设正在发生的事情是WPF错误,或者只是一个不值得失眠的怪癖,这里有一个(也许是显而易见的)解决方案:
视图模型:

private bool _isAgeInvalid;
    public bool IsAgeInvalid
    {
        get 
        {
            return _isAgeInvalid; 
        }
        set
        {
            _isAgeInvalid = value;
            this.IsAgeValidationPopupOpen = valid;
            OnPropertyChanged();
        }
    }

    private bool _isAgeValidationPopupOpen;
    public bool IsAgeValidationPopupOpen
    {
        get => _isAgeValidationPopupOpen;
        set
        {
            _isAgeValidationPopupOpen = value;
            OnPropertyChanged();
        }
    }

XAML:

<Popup Name="InvalidAgePopup" IsOpen="{Binding IsAgeValidationPopupOpen, Mode=TwoWay}"/>

即使弹出窗口的解除不应该破坏你的绑定,至少用这个方法你有一个变量总是跟踪弹出窗口打开状态,另一个总是跟踪年龄有效性状态,所以可以说它是你的UI状态的更好的表示。

相关问题