在Item Source外部绑定ViewModel字段

时间:2018-08-10 12:54:40

标签: xamarin xamarin.forms

嗨,我有一个ItemSource绑定了联系人列表

<ListView  x:Name="contactsListView" ItemsSource="{Binding contacts}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout Orientation="Horizontal">
                            <Image Source="{Binding Should be to my View Model instead of Contacts}"></Image>
                            <Label Text="{Binding FullName}"></Label>
                        </StackLayout>

                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>

全名绑定工作正常。我的问题是“联系人”模型中未包含“图像源”,因此我需要从“视图”模型中检索该图像。该怎么办?

查看模型

    public class ContactsViewModel : INotifyPropertyChanged
{
    public ObservableCollection<Contact> contacts { get; set; }
    private string _contactImage;

    public string ContactImage
    {
        get => _contactImage; set
        {
            _contactImage = value;
            OnPropertyChanged("ContactImage");
        }
    }

    public ContactsViewModel(List<Contact> _contacts)
    {
        contacts = new ObservableCollection<Contact>(_contacts);
        ContactImage = "arrow.png";



    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

代码隐藏视图

    public partial class ContactListPage : TabbedPage
{
    public ContactsViewModel vm;
    public ContactListPage (List<Contact> _contacts)
    {
        vm = new ContactsViewModel(_contacts);
        BindingContext = vm;
        InitializeComponent();

    }
}

1 个答案:

答案 0 :(得分:3)

这是因为ListView项中的范围不同于更高级别。若要克服此问题,请创建对父控件的引用。我看到您已经将您的ListView命名了,所以我们可以使用它。

这样做:<Image Source="{Binding Path=BindingContext.ContactImage, Source={x:Reference contactsListView}}"></Image>