【问题标题】:Binding Label's visible property in a list with Toggle switch使用切换开关在列表中绑定标签的可见属性
【发布时间】:2019-06-03 21:10:05
【问题描述】:

我有一个切换按钮和列表,其中包含标签。 Toggle(Switch) 和 List View 在 Xaml 文件中声明,其中 list 的 Data-cell 是在 cs 文件中以编程方式生成的。 我需要根据切换开关在列表中隐藏/显示此标签

Xaml 代码:

<Switch  IsToggled="{Binding IsToggled, Mode=TwoWay}" Grid.Row = "0" Grid.Column = "1" HorizontalOptions = "Start" Margin = "10,8,8,0"></Switch>

<ListView x:Name="lvItemSigns" HasUnevenRows="True" SeparatorVisibility="Default" SeparatorColor="Gray">

cs文件代码:

lvItemSigns.ItemTemplate = new DataTemplate(typeof(DataCell)); lvItemSigns.ItemsSource = VM.ItemSignsList;

class DataCell : ViewCell
{
   Label label;
   public DataCell()
   {
     // has grid
      var label = new Label();
            label.TextColor = Color.Black;
            label.Margin = 4;
            label.Text = "test";
            grid.Children.Add(label, 2, 1);
            label.SetBinding(Label.IsVisibleProperty, new Binding("BindingContext.IsToggled", BindingMode.TwoWay, new BooleanConverter(), null, null, "cs-file_name"));

 grid.Children.Add(stackLayout, 0, 3);

            grid.Margin = new Thickness(8,0,0,0);
            View = grid;
   }
}

在 ViewModel 中:

    public bool _IsToggled;
    public bool IsToggled
    {
        get
        {
            return _IsToggled;
        }
        set
        {
            _IsToggled= value;
            OnPropertyChanged("_IsToggled");
        }
    }
public ItemSignsTabViewModel()
{
  ItemSignsList = new ObservableCollection<TicketItem>(daItemSign.GetItemSigns(Ticket.MobileID));
}

我将可见属性绑定到标签,但我仍然可以一直看到标签(当切换开关打开或关闭时)。

我知道我做错了什么。有什么帮助吗?

【问题讨论】:

  • OnPropertyChanged("_IsToggled"); - 您需要使用公共属性的名称,而不是私有字段
  • 我也试过这种方式 OnPropertyChanged("IsToggled");没用

标签: c# listview xamarin mvvm


【解决方案1】:

Switch 绑定的 DataContext 与 DataCell 的 DataContext 不同。

两个视图都不是针对相同的对象。 您需要为页面和 DataCell 发布视图模型的代码以获得帮助。

【讨论】:

  • 你现在可以检查一下吗?这就是我正在做的事情
  • 当您在 DataCell 中创建绑定时,DataCell 的 BindingContext 不是您的“ItemSignsTabViewModel”,它是从 ItemSignsList 中检索的 TicketItem 的一个实例。您在 DataCell 代码中的标签绑定永远不会被创建,因为您要使用的属性属于父 DataContext。您需要做的是将“IsToggled”属性添加到您的 TicketItem 对象。然后,当 ItemSignsTabViewModel.IsToggled 属性设置为 true 时,更新列表的每个 TicketItem 对象,将 TicketItem.IsToggled 属性设置为 ItemSignsTabViewModel.IsToggled 值
  • 谢谢@Miiie。有效。我向 TicketItem 对象添加了一个属性,并在 OnPropertyChanged() 之前设置了它的值并且它起作用了。
猜你喜欢
  • 1970-01-01
  • 2019-03-26
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多