Binding 中的对象未显示在 ListView 中

Posted

技术标签:

【中文标题】Binding 中的对象未显示在 ListView 中【英文标题】:Objects in Binding not displayed in the ListView 【发布时间】:2021-04-29 13:15:18 【问题描述】:

我有一个 ListView,其中包含通过 ItemsSource 属性绑定的项目。我不明白为什么不显示 DataTemplate 数据。它们仍可从 Internet 正确下载,但未显示。我已经尝试从 c# 和 xaml 中插入 ItemsSource 属性,但结果没有改变

xaml

<yummy:PancakeView x:Name="ViewFrasi" IsVisible="False" Grid.Row="1" CornerRadius="30,30,0,0" BackgroundColor="White" VerticalOptions="FillAndExpand">
        <yummy:PancakeView.Border>
            <yummy:Border Color="Blue" Thickness="4"/>
        </yummy:PancakeView.Border>
        <Grid Margin="15">
            <ListView x:Name="Frasi"
                      ItemsSource="Binding FrasiJsonOnline1">
                <ListView.Header>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="40"/>
                        </Grid.RowDefinitions>
                        <BoxView CornerRadius="100" Grid.Row="0" HorizontalOptions="End" WidthRequest="40">
                            <BoxView.Background>
                                <LinearGradientBrush  StartPoint="1,0" EndPoint="1,1">
                                    <GradientStop Color="Blue" Offset="0" />
                                    <GradientStop Color="LightBlue" Offset="1.0" />
                                </LinearGradientBrush>
                            </BoxView.Background>
                        </BoxView>
                        <Image Source="checked.png" Grid.Row="0" HorizontalOptions="End" HeightRequest="20" Margin="0,0,10,0"/>
                        <Button x:Name="BtSave" IsVisible="False" Clicked="BtSave_Clicked" BackgroundColor="Transparent" Grid.Row="0" HorizontalOptions="End" HeightRequest="25"/>
                        <ImageButton Source="close.png" Grid.Row="0" HorizontalOptions="Start" HeightRequest="20" Margin="5,0,0,0" Clicked="Close_Clicked" BackgroundColor="Transparent"/>
                    </Grid>
                </ListView.Header>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <ScrollView>
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="50"/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="1*"/>
                                        <ColumnDefinition Width="5*"/>
                                    </Grid.ColumnDefinitions>
                                    <ImageButton Grid.Row="0" Grid.Column="0" Source="IconCopy.png" Clicked="CopyClipboard_Clicked"/>
                                    <Label Grid.Row="0" Grid.Column="1" Text="Test" TextColor="Black" FontSize="15"/>
                                </Grid>
                            </ScrollView>
                        </Grid>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

        </Grid>
    </yummy:PancakeView>

c#

private async void CategoryView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
        var selected = e.CurrentSelection;         
        ClassCategory model = e.CurrentSelection.FirstOrDefault() as ClassCategory;

        WebClient clientw = new WebClient();
        clientw.Credentials = new NetworkCredential("xxxxxxx", "xxxxxx");
        string Frasi1 = "ftp://epiz_27426656@ftpupload.net/htdocs/" + model.Titolo + ".json";
        string contents1 = await clientw.DownloadStringTaskAsync(Frasi1);
        ObservableCollection<FraseClass> FrasiJsonOnline1 = JsonConvert.DeserializeObject<ObservableCollection<FraseClass>>(contents1);

        ViewFrasi.IsVisible = true;
        ViewFrasi.TranslationY = 600;
        ViewFrasi.TranslateTo(0, 0, 500, Easing.SinInOut);

    

【问题讨论】:

您只能绑定到公共属性。 FrasiJsonOnline1 不是公共财产 解决办法是什么? FrasiJsonOnline1设为公共财产 public ObservableCollection&lt;FraseClass&gt; FrasiJsonOnline1 = JsonConvert.DeserializeObject&lt;ObservableCollection&lt;FraseClass&gt;&gt;(contents1); ???? 属性和作用域是 C# 的基本概念。请花时间阅读文档并了解它们是什么以及如何使用它们 【参考方案1】:

您正在使用局部变量,将其设为方法外部的公共属性并在方法内部更改其值,如下所示:


public ObservableCollection<FraseClass> FrasiJsonOnline1  get; set; 

private async void CategoryView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
        var selected = e.CurrentSelection;         
        ClassCategory model = e.CurrentSelection.FirstOrDefault() as ClassCategory;

        WebClient clientw = new WebClient();
        clientw.Credentials = new NetworkCredential("xxxxxxx", "xxxxxx");
        string Frasi1 = "ftp://epiz_27426656@ftpupload.net/htdocs/" + model.Titolo + ".json";
        string contents1 = await clientw.DownloadStringTaskAsync(Frasi1);
        FrasiJsonOnline1 = JsonConvert.DeserializeObject<ObservableCollection<FraseClass>>(contents1);

        ViewFrasi.IsVisible = true;
        ViewFrasi.TranslationY = 600;
        ViewFrasi.TranslateTo(0, 0, 500, Easing.SinInOut);

    

【讨论】:

我试图将 BackGroundColor 属性插入到 dataTemplate 内的网格中,但我没有看到任何颜色,总是白色。我不理解为什么。这可能是我看不到里面的物体的原因吗? 你有很多网格,你能指定你到底在哪里添加背景。 这只是一个测试。在我看来,什么都没有显示 dataTemplate 里面的内容 检查可见性,我看到你正在使用 IsVisible 属性,测试所有没有使用 IsVisible 和没有翻译。 我还是什么都看不到。我只是不知道如何解决【参考方案2】:

当您将 ListView 的 ItemsSource 绑定到 FrasiJsonOnline1 时。

这意味着您正在绑定到BindingContext.FrasiJsonOnline1

 ItemsSource="Binding BindingContext.FrasiJsonOnline1".

所以FrasiJsonOnline1 应该是您的BindingContext 的属性。比如你BindingContextmyViewModelFrasiJsonOnline1应该是myViewModel的一个属性,那么绑定就会成功:

public partial class MainPage : ContentPage

    public MainPage()
    
        InitializeComponent();

        BindingContext = new myViewModel();
    


public class myViewModel

    public ObservableCollection<FraseClass> FrasiJsonOnline1  get; set; 

    public myViewModel()
    
        FrasiJsonOnline1 = new ObservableCollection<FraseClass>();
        //...your codes
    

如果您按照自己的方式定义 FrasiJsonOnline1:

public class myViewModel

    public myViewModel()
    

    

    private async void CategoryView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
        ObservableCollection<FraseClass> FrasiJsonOnline1 = JsonConvert.DeserializeObject<ObservableCollection<FraseClass>>(contents1);
    

FrasiJsonOnline1 在方法内部定义,它是一个局部变量。 BindingContext(myViewModel) 没有名为 FrasiJsonOnline1 的属性,因此绑定不起作用。

【讨论】:

我试图将 BackGroundColor 属性插入到 dataTemplate 内的网格中,但我没有看到任何颜色,总是白色。我不理解为什么。这可能是我看不到里面的物体的原因吗? 您的网格由 imagebtn 和网格填充,您应该将 BackGroundColor 添加到这些元素。 @StefanoSton 我的解决方案对您有用吗?如果是,请您接受(点击此答案左上角的☑️),以便我们可以帮助更多有相同问题的人:)。 我无法用你的代码解决。我必须将我的代码插入到CategoryView_SelectionChanged 不,我没有让你把所有的代码都移出来,你只需要按照aghailan的回答,他的做法是对的。

以上是关于Binding 中的对象未显示在 ListView 中的主要内容,如果未能解决你的问题,请参考以下文章

C# wpf 中 一个窗体中的texbox内容显示另一个窗体中的listview中的内容。如何实现

android -------- Data Binding的使用 ( 四 )ListView

ListView 未显示在片段中

ScrollView 中的 Android ListView 行未完全显示 - 已剪辑

Vue 自定义指令 - 对象属性未定义

Xamarin 中的 Binding .