【发布时间】:2022-01-23 06:29:07
【问题描述】:
我正在尝试使用 Xamarin.Essentials.Contacts 更新 Entry 控件的值。
我有一个 PhoneNumber 条目,在打开页面时它是空的,但它下面有一个按钮,上面写着“选择联系人”,我正在检索电话号码并尝试将 PhoneNumber 条目的值设置为那个电话号码。
我似乎做不到,我真的不知道该怎么做。
当我选择联系人时,我会得到号码,但它不会更新条目值。
这是我的代码
XAML
<StackLayout Orientation="Horizontal"
Padding="16,12"
Spacing="12">
<Frame HorizontalOptions="FillAndExpand"
Padding="6, 1"
Margin="5, 0"
CornerRadius="8"
BackgroundColor="#212121">
<Entry x:Name="PhoneNumberEntry"
Text="{Binding PhoneNumberEntry, Mode=TwoWay}"
Placeholder="Don't add '+1'"
Keyboard="Numeric"
MaxLength="10"
Style="{StaticResource EntryStyle}" />
</Frame>
</StackLayout>
<StackLayout Orientation="Horizontal"
Padding="16,12"
Spacing="12">
<Button x:Name="ContactButton"
Text="Or select contact"
Command="{Binding SelectContactCommand}"
BackgroundColor="Red"
HorizontalOptions="FillAndExpand" />
</StackLayout>
视图模型
public class InviteViewModel : BaseViewModel
{
public InviteViewModel()
{
SelectContactCommand = new Command(async () => await ExecuteSelectContactCommand());
Info = new StringBuilder();
}
public string PhoneNumberEntry { get; set; }
public Command SelectContactCommand { get; set; }
public StringBuilder Info { get; set; }
private async Task ExecuteSelectContactCommand()
{
try
{
var contact = await Contacts.PickContactAsync();
if (contact == null)
{
return;
}
Info.AppendLine(contact.Phones.FirstOrDefault()?.PhoneNumber ?? string.Empty);
var phoneNumber = Info.ToString().Replace("(", "").Replace(")", "").Replace(" ", "").Replace("-", "").TrimEnd();
PhoneNumberEntry = phoneNumber;
}
catch (Exception ex)
{
}
}
}
【问题讨论】:
-
您确定
PhoneNumberEntry正在更新吗?你有一个空的catch块,所以如果有任何异常你永远不会知道。此外,Entry是一个单行控件,但您正在添加一个带有StringBuilder的换行符。对于这个用例,StringBuilder可能是矫枉过正 -
好吧,让我尝试不同的方式
-
所以我把StringBuilder改成了一个字符串,在catch块加了一个断点,没有任何改变
-
但是
PhoneNumberEntry真的得到了你认为的值吗? -
BaseViewModel提供了PropertyChanged方法,但您仍然必须在您的 setter 中调用它。您还可以硬编码属性的初始值,以验证绑定是否有效。您可以通过在设置后添加Console.Writeline()或在调试器中使用断点来轻松测试是否设置了属性
标签: c# xamarin.forms