我正在用UWP,x:Bind
和數據驗證掙扎了一下。 我有一個非常簡單的用例:我希望用戶在TextBox
中輸入int
,並在用戶離開TextBox
後立即在TextBlock
中顯示該號碼。 我可以爲TextBox
設置InputScope="Number"
,但這並不妨礙使用鍵盤輸入字符的人(或粘貼某個東西)。 問題是,當我綁定字段與Mode=TwoWay
,看來你不能防止System.ArgumentException
如果您綁定字段聲明爲int
。如果輸入是一個數字,我想檢查set
方法,但在此之前發生異常。 我的(很簡單)視圖模型(在這裏沒有模式,我試圖保持儘可能簡單):UWP:x:用於數字字段的綁定和數據驗證
public class MyViewModel : INotifyPropertyChanged
{
private int _MyFieldToValidate;
public int MyFieldToValidate
{
get { return _MyFieldToValidate; }
set
{
this.Set(ref this._MyFieldToValidate, value);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisedPropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
else
{
storage = value;
this.RaisedPropertyChanged(propertyName);
return true;
}
}
}
我後面的代碼:
public sealed partial class MainPage : Page
{
public MyViewModel ViewModel { get; set; } = new MyViewModel() { MyFieldToValidate = 0 };
public MainPage()
{
this.InitializeComponent();
}
}
而且我的整個XAML:
<Page
x:Class="SimpleFieldValidation.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:SimpleFieldValidation"
xmlns:vm="using:SimpleFieldValidation.ViewModel"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="10*" />
<RowDefinition Height="*" />
<RowDefinition Height="10*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBox Grid.Row="1" Grid.Column="0" Text="{x:Bind ViewModel.MyFieldToValidate, Mode=TwoWay}" x:Name="inputText" InputScope="Number" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{x:Bind ViewModel.MyFieldToValidate, Mode=OneWay}" x:Name="textToDisplay" />
</Grid>
</Page>
如果我在TextBox
中鍵入數字字符,則一切正常。但是,如果我輸入一個非數值(說「d」)(它甚至沒有在set
方法的第一支撐爲MyFieldToValidate
到達斷點):
是否有一個最佳實踐做我想做的事情?最簡單的解決方案是防止用戶輸入其他字符而不是數字,但是我一直在尋找幾個小時而沒有找到簡單的方法......另一個解決方案是在離開字段時驗證數據,但是我沒有發現與UWP和x:Bind
相關的東西(WPF認爲很少有東西,但它們不能用UWP複製)。 謝謝!
只是不將其綁定到int,將其綁定到字符串屬性,你將通過seters做所有必要的轉換和getters(或使用自定義Converter並手動將輸入轉換爲int) – RTDev