【问题标题】:Xamarin.Forms Binding works, but text is not showingXamarin.Forms 绑定有效,但未显示文本
【发布时间】:2017-01-13 18:17:55
【问题描述】:

我已经尝试将对象列表绑定到listview 很长时间了,但是尽管它可以按预期与不需要编写项目模板的列表(例如ObservableCollection<string>)一起工作,但确实如此不适用于我想要 itembinding 到列表中对象的字段的列表:

MainPage.xaml.cs:

ExampleList = new ObservableCollection<ExampleItem>()
{
    new ExampleItem() {Showing = "Item 1"},
    new ExampleItem() {Showing = "Item 2"}
};
ListView.ItemsSource = ExampleList;

Mainpage.xaml:

<ListView x:Name="ListView">
      <ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding Showing}" TextColor="White"></TextCell>
        </DataTemplate>
      </ListView.ItemTemplate>
</ListView>

虽然列表项在那里(!),但行中的文本没有显示: Binding Result

我已经尝试过这个解决方案,结果是一样的:Xamarin ListView not displaying any data

回答: 绑定似乎不能(完全)与字段一起使用,变量需要是 properties

【问题讨论】:

  • 您是否在 xaml.cs 构造函数中调用“InitializeComponent()”后为列表设置了 itemouce?我相信“InitializeComponent()”会调用更新绑定,如果你的源是在调用之后设置的,那将解释这种行为。
  • 我无法在'Initializecomponent()'之前设置Itemssource,因为组件Listview事先不存在。
  • 我有同样的问题,即使我在 XAML 中设置 ItemsSource,正如@VisualManuel 所说的项目出现在列表视图中但内容是空的。
  • @VisualManuel 您应该已经输入了答案并将其标记为答案。你真的救了我很多东西。我的模型是 4 年前写的,今天检查只是为了发现这些只是类中的变量而不是属性。因为你,我才能找到这个。真正让任何开发人员感到困惑的奇怪场景。谢谢。

标签: c# listview xamarin data-binding xamarin.forms


【解决方案1】:

确保 ItemsSource 中的 items 实现 INotifyPropertyChanged 并且您绑定到的每个属性的设置器都会触发 PropertyChanged 事件。

除了在 ItmsSource 的属性设置器上触发 PropertyChanged 之外。

【讨论】:

  • 嗯,我试过了,它奏效了。然后我很好奇并删除了 INotifypropertyChanged,仍然有效。在我看来,绑定不适用于字段,它需要属性
  • @VisualManuel 你拯救了我的一天!
【解决方案2】:

你需要设置 ItemsSource 来将 ObservableCollection 绑定到 ListView

<ListView ItemsSource="{Binding ExampleList}">
  <ListView.ItemTemplate>
    <DataTemplate>
      <TextCell Text="{Binding Showing}" TextColor="White" />
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>

还请记住,在使用 Xamarin.Forms 时,最好遵循 MVVM 模式。您应该在 ViewModel 类中有 ObservableCollection,并将其设置为 View 上的 BindingContext

编辑:ObservableCollection 似乎调用 OnPropertyChange 来更新 Add 方法上的 UI。只需在设置 ItemsSource 后将项目添加到集合中。这应该可以解决问题

ExampleList = new ObservableCollection<ExampleItem>();
ListView.ItemsSource = ExampleList;

ExampleList.Add(new ExampleItem() {Showing = "Item 1"});
ExampleList.Add(new ExampleItem() {Showing = "Item 2"});

【讨论】:

  • 如果我在 xaml 中设置 ItemsSource,它就不会显示任何内容。在我的代码中,项目在那里,只是没有显示文本。对于您的第二点,我只需要这是绑定我的学士论文的最简单的示例。 (:
  • @VisualManuel 查看答案的更新。在不牺牲简单性的情况下,使用 ViewModel 不会让你的绑定示例更简洁
  • 恐怕同样的结果。只是因为我觉得你的想法有误(对不起,如果不是这样的话),项目的绑定工作得很好,列表中显示的项目数量与我在后台放入的数量相匹配。只有部分 'Text="{Binding Showing}" ' 不起作用。 (我看到的是空列表项,就像我上传的图片一样)。
  • @VisualManuel 如果您说这些项目实际上在列表中,可能与您设置背景颜色的方式有关。
【解决方案3】:

正如 cmets 中所写的“绑定不适用于字段,它需要属性”。我是 xamarin 的新手,我很努力。但这就是明确的答案。

【讨论】:

    【解决方案4】:

    这个问题是一个老问题,已经得到很好的解决。 但您也可以通过 XAML 设置 ItemSource。 通过这样做:

    <ListView x:Name="ListView" ItemsSource="{Binding ExampleList}">
          <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding Showing}" TextColor="White"></TextCell>
            </DataTemplate>
          </ListView.ItemTemplate>
    </ListView>
    

    这可以帮助避免此类问题?

    在此处查看更多信息:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/data-and-databinding

    我希望我能以某种方式有用?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多