我有一个简单的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和其他一些方法,在弹出窗口关闭后,绑定对象仍然被清除。
1条答案
按热度按时间11dmarpk1#
假设正在发生的事情是WPF错误,或者只是一个不值得失眠的怪癖,这里有一个(也许是显而易见的)解决方案:
视图模型:
XAML:
即使弹出窗口的解除不应该破坏你的绑定,至少用这个方法你有一个变量总是跟踪弹出窗口打开状态,另一个总是跟踪年龄有效性状态,所以可以说它是你的UI状态的更好的表示。