【问题标题】:Xamarin.Forms update Entry value from Xamarin.Essentials.Contacts selection using MVVMXamarin.Forms 使用 MVVM 从 Xamarin.Essentials.Contacts 选择中更新条目值
【发布时间】: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


【解决方案1】:

就像@Jason 和@AppPack 说的,只是在PhoneNumberEntry 的setter 中使用OnPropertyChanged() 而已

private string phoneNumberEntry;

    public string PhoneNumberEntry
    {
        get { return phoneNumberEntry; }
        set
        {
            phoneNumberEntry = value;
            OnPropertyChanged("PhoneNumberEntry");
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2017-04-22
    • 2019-10-10
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多