我似乎在Xamarin Forms项目中遇到数据绑定问题。我有两个观点:一个用于列出项目,另一个用于查看详细信息。
列表视图加载项目列表及其所有属性,但详细信息页面为空白,不会绑定到属性。
列表的viewmodel如下所示:
public class MainPageViewModel : ViewModelBase
{
public MainPageViewModel(IItemService itemService) : base(itemService) { }
public ObservableCollection<ItemModel> Items { get; set; } = new ObservableCollection<ItemModel>();
public async override void Start()
{
base.Start();
Items.Clear();
var results = await service.GetItems();
foreach (var result in results)
{
Items.Add(result);
}
IsLoading = false;
}
}
并且绑定到这个xaml:
<ListView x:Name="ItemListView" ItemsSource="{Binding Items}" ItemSelected="ItemListView_ItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<StackLayout Orientation="Vertical">
<Image Source="{Binding Image}" />
</StackLayout>
<StackLayout Orientation="Vertical" Grid.Column="1">
<Label Text="{Binding Name}" />
<Label Text="{Binding Description}" />
</StackLayout>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
再一次,这很有效。
但详情视图如下:
public class DetailsPageViewModel : ViewModelBase
{
public DetailsPageViewModel(IItemService itemService) : base(itemService) { }
private ItemModel item;
public ItemModel Item
{
get { return item; }
set
{
item = value;
RaisePropertyChanged();
}
}
protected string ItemId { get; set; }
public void Init(string itemId)
{
this.ItemId = itemId;
}
public async override void Start()
{
base.Start();
Item = await service.GetItem(ItemId);
IsLoading = false;
}
}
我尝试将ItemModel属性绑定到详细信息视图上的标签:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MvvmCrossFormsDemo.Views.DetailsPageView">
<StackLayout>
<Label Text="{Binding Item.Name}" />
<Image Source="{Binding Item.Image}" />
</StackLayout>
</ContentPage>
页面完全空白。
我是否必须将INotifyPropertyChanged添加到我的ItemModel?如果是这样,我不明白为什么,因为ListView绑定相同的模型没有任何这样的需要,那么为什么不能定期标签绑定?
我做错了什么?
答案 0 :(得分:7)
您需要先在ViewModel中指定该属性。 ListView已直接绑定到ViewModel中的属性,然后ViewCell已绑定到单个项目。
在详细信息页面中,您直接绑定到ViewModel,因此没有属性Name或Image,它们是Item的属性,您需要先指定它。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MvvmCrossFormsDemo.Views.DetailsPageView">
<StackLayout>
<Label Text="{Binding Item.Name}" />
<Image Source="{Binding Item.Image}" />
</StackLayout>
</ContentPage>