Xamarin表单视图不会使用自定义类更新

时间:2017-07-12 19:20:09

标签: xamarin mvvm xamarin.forms prism-6

我在这个项目中使用Prism.Unity.Forms和Xamarin。如何在Client.Id属性更改时让视图更新?当我将XAML从{Binding Client.Id}(Guid对象)更改为{Binding Client.Name}(字符串)时,视图会更新。

public class CreateClientViewModel : BindableBase
{
    private Client _client;
    public Client Client {
        get => _client;
        set => SetProperty(ref _client, value);
    }

    private async void FetchNewClient()
    {
        Client = new Client{
            Id = new Guid.Parse("501f1302-3a45-4138-bdb7-05c01cd9fe71"),
            Name = "MyClientName"
        };
    }
}

这有效

<Entry Text="{Binding Client.Name}"/>

这不是

<Entry Text="{Binding Client.Id}"/>

我知道在ToString属性上调用了Client.Id方法,因为我将Guid包装在自定义类中并覆盖ToString方法,但视图仍然没有更新。

public class CreateClientViewModel : BindableBase
{
    private Client _client;
    public Client Client {
        get => _client;
        set => SetProperty(ref _client, value);
    }

    //This method will eventually make an API call.
    private async void FetchNewClient()
    {
        Client = new Client{
            Id = new ClientId{
                Id = new Guid.Parse("501f1302-3a45-4138-bdb7-05c01cd9fe71")
            },
            Name = "MyClientName"
        };
    }
}

public class ClientId
{
    public Guid Id { get; set }

    public override string ToString()
    {
        //This method gets called
        Console.WriteLine("I GET CALLED");
        return Id.ToString();
    }
}

1 个答案:

答案 0 :(得分:0)

使用Converter解决了问题,但我无法解释原因。无论如何都要调用Guid.ToString方法。

<Entry Text="{Binding Client.Id, Converter={StaticResource GuidConverter}}"/>

public class GuidConverter : IValueConverter
{
    public object Convert()
    {
        var guid = (Guid) value;
        return guid.ToString();
    }

    public object ConvertBack(){...}
}

然后我在App.xaml

中注册了转换器
<ResourceDictionary>
    <viewHelpers:GuidConverter x:Key="GuidConverter" />
</ResourceDictionary>