【发布时间】:2021-05-19 07:13:50
【问题描述】:
我有一个ContentPage,其中包含一个CarouselView。内容页有 1 个列表属性 (ActivityData),用作 ItemSource。
ContentPage 使用ItemTemplate (ContentView) 来显示不同的元素。此 ContrentView 包含在“主”属性中定义的属性; ActivityData.
我想要实现的是以下内容,在我的 ContentView 中有一个卡片列表。此列表的 ItemSource 是 List 属性“LocationFloors”,该属性包含在 ContentPage 的 ViewModel 中定义的 ActivityData 属性中。
我已经设置了一个TapGestureRecognizer 事件来捕捉列表卡片上的“点击”事件。发生这种情况时,点按的卡片应将其背景更改为红色,而列表中的所有其他卡片应将背景更改为蓝色。
我已经进行了一些设置,但是我在设置 LocationFloors 项目的值同时触发 NotifyPropertyChanged 事件以便 UI 发生变化时遇到了问题。
NotifyPropertyChanged 现在在ViewModel 本身中实现,但只会在我设置/更改ActivityData 属性时触发。这是否意味着我必须直接在ActivityData 属性中更改LocationFloor 项?
如何从 ContentView 访问(获取/设置)在 ViewModel 中定义的 ActivityData 属性?
ContentView 代码:
public partial class PCSActivityOverviewTemplate : ContentView
{
public PCSActivityOverviewTemplate()
{
InitializeComponent();
}
private void OnTapGestureRecognizerTapped(object sender, EventArgs args)
{
var model = ((CardView)sender).BindingContext as ActivityFloor;
if(model.IsSelected == false)
{
model.IsSelected = true;
// Not triggering PropertyChanged...
}
}
}
ViewModel:
public class ActivityOverviewViewModel : ObservableObject
{
private List<ActivityLocation> activityData;
private readonly IRoutingService _routingService;
// The dataSource
public List<ActivityLocation> ActivityData
{
get { return activityData; }
set { SetProperty(ref activityData, value); }
}
public ActivityOverviewViewModel(IRoutingService routingService = null)
: base(listenCultureChanges: true)
{
_routingService = routingService ?? Locator.Current.GetService<IRoutingService>();
LoadData();
}
private async void LoadData()
{
// Set DataSource of Page
var _activitiesData = await App.Database.GetActivityDataAsync(DateTime.UtcNow);
ActivityData = _activitiesData;
}
}
ActivityData 列表模型:
public class ActivityLocation
{
public int LocationId { get; set; }
.. few more properties
public List<ActivityFloor> LocationFloors { get; set; }
}
public class ActivityFloor
{
public int FloorId { get; set; }
.. some other properties
public bool IsSelected { get; set; } // property with which the Backgroundcolor of a Card should change.
}
【问题讨论】:
-
友情提示:请避免通过删除closed question并重新发布改进版本来绕过系统,最好选择What if I disagree with the closure of a question? How can I reopen it?
-
我在这里感到困惑“在我的 ContentView 我有一个卡片列表”我没有看到您所指的列表,可能不是 ActivityData,因为它在 vm 中而不是 ContentView 中。或者你的意思是 ListView ?
-
@Cfun 是的,我的错,我没有看到重新打开按钮。是的,我的意思是 ListView,它实际上是从
Layout<View>派生的 WrapPanel,它的 ItemSource 绑定设置为 ActivityData 属性中包含的 LocationFloors List 属性。
标签: c# xamarin xamarin.forms mvvm