xamarin表单:根据条件打开或关闭listview开关?

时间:2018-05-15 03:03:04

标签: listview xamarin.forms

我有一个带开关的列表视图,如下面的屏幕截图所示。

enter image description here

string userIds = Application.Current.Properties [“GroupUserIds”]。ToString(); (userIds是逗号分隔的字符串) 如果上面的字符串(userIds)中存在switch项的id,我需要在switch项上。

例如,如果Vimal Mathew的id为120且userIds的值为181,481,476,120,132(在userIds中存在120)。那么Vimal Mathew的开关应该处于开启状态,其他列表项开关应该处于关闭状态,那些不在用户名字符串中。

我试过如下:

绑定userId并调用转换器。

  <Switch
         Toggled="OnToggledEvent"
         IsToggled="{Binding userProfileTO.userId,  Converter={StaticResource userIdExistConverter}}"
         HorizontalOptions="EndAndExpand"
         VerticalOptions="CenterAndExpand"/>

在转换器中,通过用逗号分割来形成userIds中的列表,并检查用户ID是否存在于列表中。如果列表中存在userid,则返回true而不存在返回false。

我的转换器代码:

class UserIdExistConverter : IValueConverter
 {
#region IValueConverter implementation
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value == null)
        return string.Empty;

        bool exist = false;
        string userIds = Application.Current.Properties["GroupUserIds"].ToString();
        List<string> userIdList = userIds.Split(',').ToList();
        Debug.WriteLine("listcount:>>" + userIdList.Count);
        for (int i = 0; i < userIdList.Count; i++)
        {
            if (value.ToString() == userIdList[i])
            {
                exist = true;
                break;
            }
        }
    return exist;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
    throw new NotImplementedException();
}
#endregion
}
}

但是获取未处理的异常:System.NotImplementedException:未实现方法或操作。

我这里没有使用任何viewmodel。我在whatsapp中执行类似组的功能,字符串userIds包含当前组成员ID,因此当我搜索添加新成员时,已添加的成员开关应该处于打开状态。

Bool方法,如果组中存在id,则返回true;如果组中不存在,则返回false。

bool IsUserInList(int userId)
{
string userIds = Application.Current.Properties["GroupUserIds"].ToString();
List<int> userIdList = userIds.Split(",").Select(id => int.Parse(id)).ToList();
return userIdList.Contains(userId);
}

我不知道我的逻辑是否正确,请对此有所了解。

提前致谢

1 个答案:

答案 0 :(得分:0)

我会彻底抛弃转换器并采用更加以视图模型为中心的方式。您的页面有一个视图模型,单元格也有。与单元格关联的视图模型具有基于用户列表中存在的值设置或取消设置的属性Selected

class UsersPageViewModel : INotifyPropertyChanged
{
    public IEnumerable<UserViewModel> Users
    {
        get => this.users;

        set
        {
            if(value == this.users)
            {
                return;
            }
            this.users = value;
            OnPropertyChanged();
        }
    }

    public string UserIds 
    {
        get => this.userIds;

        set 
        {
            this.userIds = value;
            UpdateUsers();
        }
    }

    private void UpdateUsers()
    {
        var userIds = this.UserIds.Split(',').Select(s => int.Parse(s)).ToArray(); // add error handling

        foreach(var user in Users)
        {
            user.Selected = userIds.Contains(user.Id);
        }
    }

    protected void OnPropertyChanged([CallerMemberName] string callerName = null)
    {
        PropertyChanged?.Invoke(new PropertyChangedEventArgs(callerName));
    }
}

UserViewModel非常简单

class UserViewModel : INotifyPropertyChanged
{
    User user;

    public UserViewModel(User user)
    {
        this.user = user;
    }

    public bool Selected
    {
        get => this.selected;

        set
        {
            if(selected == value)
            {
                return;
            }
            selected = value;
            OnPropertyChanged();
        }
    }

    public int Id => this.user.Id;

    // OnPropertyChanged is implemented the same way
    // add more properties as you need them
}

您的XAML不必关心逻辑,而只关心如何以这种方式表示vms。请注意,我省略了加载用户和所选用户列表的代码。我认为这个差距可以很容易地填补。