在ListCell中更改Xamarin标签不起作用

时间:2016-06-24 17:07:52

标签: c# xamarin xamarin.forms

我有一个ListView的问题。我希望每个Cell都有一个标签和一个开关,但标签的文本不会出现。

这是我的代码:

public class FilterPage : ContentPage
{
    public FilterPage()
    {
        List<FilterCell> listContent = new List<FilterCell>();
        foreach(string type in Database.RestaurantTypes)
        {
            FilterCell fc = new FilterCell();
            fc.Text = type;

            listContent.Add(fc);
        }
        ListView types = new ListView();
        types.ItemTemplate = new DataTemplate(typeof(FilterCell));
        types.ItemsSource = listContent;

        var layout = new StackLayout();
        layout.Children.Add(types);

        Content = layout;
    }
}

public class FilterCell : ViewCell
{
    private Label label;
    public Switch CellSwitch { get; private set; }
    public String Text{ get { return label.Text; } set { label.Text = value; } }


    public FilterCell()
    {
        label = new Label();
        CellSwitch = new Switch();

        var layout = new StackLayout
        {
            Padding = new Thickness(20, 0, 0, 0),
            Orientation = StackOrientation.Horizontal,
            HorizontalOptions = LayoutOptions.FillAndExpand,
            Children = { label, CellSwitch }
        };
        View = layout;
    }
}

如果我在FilterCell-Constructor中输入一个固定的Text,它可以正常工作(例如:label.Text =“Hello World”)

当我为ItemSelected-Event创建一个Method并读出SelectedItem.Text属性时,我得到了我指定为Value的文本,但它从未显示过。我尝试运行此代码时仅显示开关。

感谢您的帮助 尼科

1 个答案:

答案 0 :(得分:3)

哦,小伙子。这段代码看起来像强奸(对不起,我不得不这样说)。

现在让我们看看错误:

原因是您正在混合数据并查看严重

该行

types.ItemTemplate = new DataTemplate(typeof(FilterCell));

表示:&#34;对于列表中的每个项目(ItemsSource),请创建新的过滤器单元格&#34;。您在循环中创建的FilterCell永远不会显示。

轻松修复

public class FilterPage : ContentPage
{
    public FilterPage()
    {
        var restaurantTypes = new[] {"Pizza", "China", "German"}; // Database.RestaurantTypes
        ListView types = new ListView();
        types.ItemTemplate = new DataTemplate(() =>
        {
            var cell = new SwitchCell();
            cell.SetBinding(SwitchCell.TextProperty, ".");
            return cell;
        });
        types.ItemsSource = restaurantTypes;
        Content = types;

    }
}
  • 标准单元格类型包含标签和开关SwitchCell,请使用它。
  • 作为列表的ItemsSource,您必须使用数据。在您的情况下,餐厅类型列表。我只是用静态列表嘲笑它们。
  • DataTemplate创建SwitchCell并为Text属性设置数据绑定。这是View和数据之间的神奇胶水。 &#34;。&#34;将其绑定到数据项本身。我们使用它,因为我们的列表包含字符串项,Text应该是字符串。 (阅读关于数据绑定:https://developer.xamarin.com/guides/xamarin-forms/getting-started/introduction-to-xamarin-forms/#Data_Binding
  • 我划掉了包含该列表的StackLayout。您可以直接将列表设置为页面的Content

<强>课

  • 尽可能使用标准控件
  • 您应该始终尝试记住保持数据和视图彼此分开,并使用数据绑定相互连接。
  • 尽量避免不必要的观点。