如何使用 XAML 绑定在 ListView 中显示 List<int> 的值?

Posted

技术标签:

【中文标题】如何使用 XAML 绑定在 ListView 中显示 List<int> 的值?【英文标题】:How do I display the values of a List<int> in a ListView using XAML binding? 【发布时间】:2021-08-21 11:14:45 【问题描述】:

我使用 Microsoft.Toolkit.Mvvm 库作为 MVVM 库。我的 C# 代码如下:

class SampleViewModel : ObservableObject
 
    private List<int> _sampleList;
    public List<int> sampleList
    
        get => _sampleList;
        set
        
            SetProperty(ref _sampleList, value);
        
    

我试图用来显示List&lt;int&gt; 的所有值的 XAML 代码是:

<ListView x:Name="mylistview" ItemsSource="x:Bind ViewModel.sampleList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <ItemsControl ItemsSource="Binding">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate x:DataType="x:Int32">
                            <TextBlock Text="x:Bind" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

更新列表时,创建了元素,但不显示 int 的值,只存在一个空行。如果我使用以下内容,我可以显示该值:

<TextBlock Text="x:Bind ViewModel.sampleList[0], Mode=TwoWay, UpdateSourceTrigger=PropertyChanged"/>

我应该如何更改 ListView,以便它也显示值?

【问题讨论】:

【参考方案1】:

我认为你想要做的事情过于复杂

<ListView x:Name="mylistview" ItemsSource="x:Bind ViewModel.sampleList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:Int32">
            <TextBlock Text="x:Bind" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

应该做的伎俩

这读作为 sampleList 中的每个项目创建一个文本框 如果这不起作用,那么问题很可能是您的数据上下文尚未设置并且绑定无法跟踪相对地址

你也应该尝试使用 Observable collection

public ObservableCollection<int> sampleList  get ; = new ObservableCollection<int>();

这是因为您应该更改列表的内容而不是列表本身,因此您需要 INotifyCollectionChanged 事件来通知绑定内容已更改

【讨论】:

当我也回复了另一个答案时,简化的代码会引发 DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION。我将尝试使用 ObservableCollection,尽管在​​这种情况下,我必须更改一些内容,因为 List 是通过数据库调用更新的。我会报告进展情况! 这不是绑定错误,请参阅***.com/questions/35392931/… 最后的工作是将代码中的 更改为 ,然后错误消失了,ListView 也起作用了。 可能是我没有见过的工具包的一个怪癖,但无论哪种方式都不是问题的绑定,因此如果没有您的开发输出就无法诊断【参考方案2】:
    尝试使用ObservableCollection&lt;int&gt; 而不是List&lt;int&gt; 您在 XAML 中的绑定非常复杂。请尝试以下方法:
    <ListView x:Name="mylistview" ItemsSource="x:Bind ViewModel.sampleList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Label Content="x:Bind" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

【讨论】:

带有 List 的简化代码会引发 DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION。我将尝试使用 ObservableCollection,尽管在​​这种情况下我必须更改一些内容,因为 List 是通过数据库调用更新的。我会报告进展情况!

以上是关于如何使用 XAML 绑定在 ListView 中显示 List<int> 的值?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 表单 ListView ItemTapped/ItemSelected 命令绑定在 XAML

Xamarin表单ListView ItemTapped / ItemSelected在XAML上绑定命令

选择器 ItemSource 值未绑定在 XAML ListView 中

XAML ListView - 相互堆叠项目

XAML 中的 WPF ListView 绑定 ItemsSource

UWP ListView 绑定 单击 选中项 颜色