【问题标题】:Toggle CheckBox inside a ViewCell in Xmarin.Forms在 Xamarin.Forms 中的 ViewCell 内切换 CheckBox
【发布时间】:2020-06-08 23:59:05
【问题描述】:

我想知道如何在我的 ListView - ViewCell on item tapped 事件中切换当前复选框。

<ListView x:Name="listViewCities"
                      ItemSelected="ListViewCities_ItemSelected"
                      ItemTapped="ListViewCities_ItemTapped">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal">
                    <CheckBox x:Name="chkSelectedCity" />
                    <Label Text="{Binding Name}" 
                                       FontSize="Medium"
                                       VerticalOptions="CenterAndExpand" />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这是我的物品点击事件。

private void ListViewCities_ItemTapped(object sender, ItemTappedEventArgs e)
{
    //Here i want to toggle the current check box as true
    //something like chkSelectedCity.checked = true;
}

【问题讨论】:

  • 您需要将复选框绑定到模型上的属性,然后在点击时切换该属性
  • 实际上我是 xamarin 表单的初学者。如果您发布示例或示例链接,将会很有帮助。

标签: checkbox xamarin.forms toggle code-behind


【解决方案1】:

您可以使用MVVM为ListView绑定一个ViewModel,当模型的数据发生变化时,UI会随之更新。

如创建一个CellClass如下:

public class CellClass : INotifyPropertyChanged
{
    public string Name { set; get; }

    private bool selected { get; set; }

    public bool Selected
    {
        set
        {
            if (selected != value)
            {
                selected = value;
                OnPropertyChanged("Selected");
            }
        }
        get
        {
            return selected;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后在新创建的类(ListViewModel)中为CellClass设置一些数据:

public class ListViewModel
{
    public List<CellClass> cellItems { set; get; }

    public ListViewModel()
    {
        cellItems = new List<CellClass>();
        cellItems.Add(new CellClass() { Name = "One", Selected = false });
        cellItems.Add(new CellClass() { Name = "Two", Selected = false });
        cellItems.Add(new CellClass() { Name = "Three", Selected = false });
        cellItems.Add(new CellClass() { Name = "Four", Selected = false });
        cellItems.Add(new CellClass() { Name = "Five", Selected = false });
        cellItems.Add(new CellClass() { Name = "Six", Selected = false });

    }
}

现在 Xaml 代码如下:

<ListView x:Name="listViewCities"
            ItemSelected="listViewCities_ItemSelected"
            ItemTapped="ListViewCities_ItemTapped">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout Orientation="Horizontal">
                    <CheckBox x:Name="chkSelectedCity"
                                IsChecked="{Binding Selected}"/>
                    <Label Text="{Binding Name}"
                            FontSize="Medium"
                            VerticalOptions="CenterAndExpand" />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

在ContentPage中可以处理ListViewCities_ItemTapped的方法和ListView的绑定模型:

public MainPage()
{
    InitializeComponent();

    ListViewModel listViewModel = new ListViewModel();
    listViewCities.ItemsSource = listViewModel.cellItems;
}

private void ListViewCities_ItemTapped(object sender, ItemTappedEventArgs e)
{
    //Here i want to toggle the current check box as true
    //something like chkSelectedCity.checked = true;
    var model = e.Item as CellClass;
    if (model.Selected)
    {
        model.Selected = false;
    }
    else
    {
        model.Selected = true;
    }
    Console.WriteLine("clicked");
}

效果:

这是sample project link供参考,有时间可以看看。

【讨论】:

  • 直到现在我都没有时间尝试您的解决方案。明天我会试着检查并告诉你。感谢发帖。
  • @Thameem Okey,无论结果如何,请随时在此处更新 :-)
  • 感谢您的回答。它就像一个魅力。但我想知道如何为许多属性处理这个问题,比如说一个类中的 10 个道具.. 看起来很乏味..
  • @Thameem 你是什么意思10个道具在一个类,你可以详细说明。
  • Jiang - 我有一个复选框按钮和另一个复选框以及第三个开关如何。对于我添加到我的模型中的每个属性,我是否应该遵循上述支持字段概念的方法,并且我希望它们在我在 xaml 中切换它们时立即更新。我希望你能得到我的怀疑。如果不是请回复我。我会进一步解释..
【解决方案2】:

为你的模型添加一个布尔属性

public bool Selected { get; set; }

然后将您的复选框绑定到它

<CheckBox IsChecked="{Binding Selected}" />

然后在你的处理程序中

private void ListViewCities_ItemTapped(object sender, ItemTappedEventArgs e)
{
    var item = (MyClass)e.Item;
    item.Selected = !item.Selected;
}

【讨论】:

  • 它不工作。我应该使用 ObsevableCollection 吗?
  • 您的模型是否实现了 INotifyPropertyChanged?
  • 嗯,它需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2014-09-29
相关资源
最近更新 更多