包含

时间:2016-06-02 21:25:23

标签: android xamarin mvvmcross

我正在使用Xamarin& amp;开发Android应用程序MvvmCross。 View Models的简单版本可能如下所示:

public abstract class PersonViewModelBase
{
    public string Name { get; set; }
}

public interface ICanRemove
{
    MvxCommand RemoveCommand { get; }
}

public class LonelyPersonViewModel : PersonViewModelBase, ICanRemove
{
    public bool IsHappy { get; set; }

    public MvxCommand RemoveCommand { get { return new MvxCommand(() => RemoveFriend())); } }

    private void RemoveFriend()
    {
        // Sends msg to remove a friend (using IMvxMessenger)
    }
}

public class TiredPersonViewModel : PersonViewModelBase, ICanRemove
{
    public int HoursSleepNeeded { get; set; }

    // [ICanRemove implementation]
}

public class FriendlyPersonViewModel : PersonViewModelBase
{

    public List<PersonViewModelBase> Friends { get; set; }

    public MvxCommand AddFieldCommand
    {
        get
        {
            return new MvxCommand(
                () => AddFriend());
        }
    }

    private void AddFriend()
    {

    }
}

public class FriendsViewModel : MvxViewModel
{
    public void Init()
    {
        Friends.Add(new LonelyPersonViewModel { Name = "Friend 1" });
        Friends.Add(new TiredPersonViewModel { Name = "Friend 2" });

        var friend3 = new FriendlyPersonViewModel { Name = "Friend 3" };
        friend3.Friends.Add(new LonelyPersonViewModel { Name = "SubFriend 1" });
        friend3.Friends.Add(new TiredPersonViewModel { Name = "SubFriend 2" });
        Friends.Add(friend3);

        Friends.Add(new LonelyPersonViewModel { Name = "Friend 4" });

        var friend5 = new FriendlyPersonViewModel { Name = "Friend 5" };
        var conjoinedFriend1 = new ConjoinedPersonViewModel { Name = "MultiPerson 1" };
        conjoinedFriend1.CoPeople.Add(new TiredPersonViewModel { Name = "Jim" });
        conjoinedFriend1.CoPeople.Add(new LonelyPersonViewModel { Name = "Nancy" });
        friend5.Friends.Add(conjoinedFriend1);
        Friends.Add(friend5);
    }
    public ObservableCollection<PersonViewModelBase> Friends { get; set; } = new ObservableCollection<PersonViewModelBase>();
}

“朋友”视图将是一个ListView,将“朋友”显示为平面项目或其他朋友列表。所以它看起来像这样:

  • 朋友1
  • 朋友2
  • 朋友3 [添加]
    • SubFriend 1 [Del]
    • SubFriend 2 [Del]
  • 朋友4
  • 朋友5 [添加]
    • MultiPerson 1 [Del]
      • 吉姆
      • 南西

[Add]和[Del]是绑定到ViewModel上的Add / Delete命令的按钮。目前,我正在使用PolymorphicListView示例中的CustomAdapter,因此每个ViewModel都映射到自定义布局。但是,我目前没有显示FriendlyPersonViewModel或ConjoinedPersonViewModel的完整信息。

我对如何继续进行了抨击:

  1. 我研究了嵌套列表视图,发现它不是一个好的用户体验,我没有通过实际将自定义适配器连接到子列表视图。
  2. 我开始手动压缩列表并让FriendsListView中的Friends集合处理添加/删除。但是,我需要让朋友们出现在合适的朋友之下,他们目前只是出现在列表的底部,这是不明智的,因为实际的ViewModel稍微复杂一点,并且会导致相当多的冗余添加的每位朋友都会重复使用FriendlyPeople名称。
  3. 我查看了Conference示例中的旧GroupedListView示例,但每个朋友实际上不在一个组中,有些将单独显示。
  4. 以下是我目前的应用程序到目前为止的工作方式。带有“添加”按钮的第一个深蓝色部分用于添加后面的深蓝色部分;同样适用于绿色部分。正如我上面提到的,当我点击Add时,我想让后面的深蓝色部分显示第一个深蓝色部分。我希望第一个蓝色/绿色部分基本上是一个标题,并在它下面有下一个蓝色/绿色部分;然后点击添加并在右侧部分显示下一个正确的颜色而没有另一个标题。

    Current App

    有没有人对如何通过MVVMCross使用Xamarin.Android实现这一目标有任何建议或指导?

    谢谢!  -g

    事后补充:看起来ObservableCollection上有一个InsertItem,如果我找到为secrion添加的最后一个项目的位置,我想添加下一个PersonBase,UI会正确更新吗? (已经离开了办公桌,或者我会检查。)

    更新

    只需使用Insert(idx,item)插入项目,实际上会正确更新UI并在正确的位置显示新项目。下一步是,你如何设计项目的样式,使它们显然是一个“群体”?

0 个答案:

没有答案