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<FraseClass> FrasiJsonOnline1 = JsonConvert.DeserializeObject<ObservableCollection<FraseClass>>(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
的属性。比如你BindingContext
是myViewModel
,FrasiJsonOnline1
应该是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