uwp - 如何解决 NumberBox 中忽略的 UpdateSourceTrigger
问题描述
我试图在 UWP 应用程序中设置UpdateSourceTrigger
数据绑定PropertyChanged
NumberBox 。
我的数据表单范例是在实际保存数据更改之前不显示“保存”按钮,但是由于在焦点离开控件之前不会更新数据源,因此在用户移动到不同的位置之前保存按钮不可用先输入控制。
- 用户无法单击保存按钮,因为它已被禁用,因此不会触发焦点更改。
这是最小的示例,如果您使用微调器更改值,则按钮可用,如果您只在控件中键入,则必须单击按钮两次,一次启用它(提交值更改),然后一次再次,现在按钮可用。
如果
UpdateSourceTrigger
不起作用,如何提交更改,以便用户可以在按钮应该可用时第一次单击按钮,所以在焦点更改之前?
<Page
x:Class="App3.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App3"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:muxc="using:Microsoft.UI.Xaml.Controls"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Page.DataContext>
<local:DataClass/>
</Page.DataContext>
<Grid>
<StackPanel>
<muxc:NumberBox Value="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SpinButtonPlacementMode="Inline"/>
<Button IsEnabled="{Binding NotZero, Mode=OneWay}" Click="Button_Click">Click if Not Zero</Button>
</StackPanel>
</Grid>
</Page>
using System;
using System.ComponentModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
namespace App3
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
public DataClass Model { get => this.DataContext as DataClass; }
private async void Button_Click(object sender, RoutedEventArgs e)
{
var msg = new Windows.UI.Popups.MessageDialog($"Value: {Model.Value}");
await msg.ShowAsync();
}
}
public class DataClass : INotifyPropertyChanged
{
public double Value
{
get => _v;
set
{
_v = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Value)));
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(NotZero)));
}
}
private double _v;
public bool NotZero { get => _v != 0; }
public event PropertyChangedEventHandler PropertyChanged;
}
}
解决方案
这是 的默认行为NumberBox
,通常用于NumberBox
在输入完成后对中的内容进行一些判断。
在NumberBox 的控件样式定义中,主体是TextBox
. 如果你想干预这个过程,你需要得到这个TextBox
。
1. 定义视觉方法
public static class StaticExtension
{
public static FrameworkElement VisualTreeFindName(this DependencyObject element, string name)
{
if (element == null || string.IsNullOrWhiteSpace(name))
{
return null;
}
if (name.Equals((element as FrameworkElement)?.Name, StringComparison.OrdinalIgnoreCase))
{
return element as FrameworkElement;
}
var childCount = VisualTreeHelper.GetChildrenCount(element);
for (int i = 0; i < childCount; i++)
{
var result = VisualTreeHelper.GetChild(element, i).VisualTreeFindName(name);
if (result != null)
{
return result;
}
}
return null;
}
}
2.附加TextChanged处理程序
Xaml
<muxc:NumberBox ... Loaded="NumberBox_Loaded"/>
Xaml.cs
private void NumberBox_Loaded(object sender, RoutedEventArgs e)
{
var box = sender as NumberBox;
var textBox = box.VisualTreeFindName<TextBox>("InputBox");
textBox.TextChanged += TextBox_TextChanged;
}
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
string text = (sender as TextBox).Text;
bool isNumber = !text.Any(t => !char.IsDigit(t));
if (isNumber)
{
double.TryParse(text, out double value);
if (value != Model.Value)
Model.Value = value;
}
}
推荐阅读
- file - Dart 是否有任何可以将日志放入文件(电子邮件等)的日志管理器?
- python - 发送实时连续日志数据到kafka并消费
- facebook - 在容器中放置带有条件的 Fb 登录按钮的位置
- ios - 是否可以进行 OTP 自动填充但不允许手动输入?
- asp.net-mvc - ASP.NET MVC : DateTime is taking format as MM/dd/yyyy but I need in dd/mm/yyyy
- sql - How to also retrieve row/record count from following DB2 query?
- javascript - Is their any better way to set duplicate array data instead of use data[0]
- amazon-web-services - AWS Cognito 获取用户位置
- python - 在 pytest 中运行并行测试
- javascript - 如何在异步的反应功能组件中使用 useState