listview 单元格未使用数据绑定进行更新
listview cell not updating using data binding
我绑定了物品来源和数据。数据确实发生了变化,但 UI 并未反映这些变化。
我注意到每当 TestUpdateCell
被调用时,SetProperty(ref items, value)
也不会被调用。但是,如果我在 TestUpdateCell
:
的末尾添加此语句
var temp = Items;
Items = new List<Item>();
Items = temp;
SetProperty(ref items, value)
是调用,但 UI 未反映更改。
此外,我尝试使用 ObservableCollection 而不是 List 并使用 Xamarin 的文档 https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/
编辑以包含解决方案(Gerald Versluis 提出的解决方案)
解决方案:项目class
public class Item : MvvmHelpers.ObservableObject
{
string name;
public string Name
{
get { return name; }
set { SetProperty(ref name, value); }
}
}
问题: 项目class:
public class Item : MvvmHelpers.ObservableObject
{
public string Name { get; set; }
}
项目数据class:
public class ItemData : List<Item>
{
public ItemData()
{
Add(new Item
{
Name = "Item One"
});
Add(new Item
{
Name = "Item Two"
});
Add(new Item
{
Name = "Item Three"
});
}
}
查看模型:
public class ItemViewModel : MvvmHelpers.BaseViewModel
{
public ItemViewModel()
{
Items = new ItemData();
}
List<Item> items;
public List<Item> Items
{
get { return items; }
set { SetProperty(ref items, value); }
}
public void TestUpdateCell()
{
Items[0].Name = "Item One Updated";
}
}
项目页面 cs:
public class ItemPage : ContentPage
{
ItemViewModel ivm;
public ItemPage()
{
BindingContext = ivm = new ItemViewModel();
}
void ItemTapped(object sender, ItemTappedEventArgs e)
{
ivm.TestUpdateCell();
}
}
itempage.XAML:
ListView
ItemsSource="{Binding Items}"
ItemTapped="ItemTapped" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<view:MyItemView/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView
我的项目视图:
<ContentView
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MyProject;assembly=MyProject"
x:Class="MyProject.MyItemView">
<local:CardFrame
IsClippedToBounds="True"
HasShadow="True" >
<StackLayout
Spacing="0"
Orientation="Horizontal">
<Grid
RowSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<local:MyLabel
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="4"
FontSize="18"
FontAttributes="Bold"
Text="{Binding Name}"/>
<!-- omitted rows and columns -->
</Grid>
</StackLayout>
</local:CardFrame>
</ContentView>
如果我没看错的话,您现在已经在包含项目的列表中实施了 属性 更改机制。当您想更改 项中的值时。
实施 属性 更改(也)在 Item
class 中。
如果要动态添加和删除单元格,请将它们放在 ObservableCollection
中。但又一次;重要的是要注意这里;只观察列表本身的变化,而不是列表项内部的变化。
我绑定了物品来源和数据。数据确实发生了变化,但 UI 并未反映这些变化。
我注意到每当 TestUpdateCell
被调用时,SetProperty(ref items, value)
也不会被调用。但是,如果我在 TestUpdateCell
:
var temp = Items;
Items = new List<Item>();
Items = temp;
SetProperty(ref items, value)
是调用,但 UI 未反映更改。
此外,我尝试使用 ObservableCollection 而不是 List 并使用 Xamarin 的文档 https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/
编辑以包含解决方案(Gerald Versluis 提出的解决方案)
解决方案:项目class
public class Item : MvvmHelpers.ObservableObject
{
string name;
public string Name
{
get { return name; }
set { SetProperty(ref name, value); }
}
}
问题: 项目class:
public class Item : MvvmHelpers.ObservableObject
{
public string Name { get; set; }
}
项目数据class:
public class ItemData : List<Item>
{
public ItemData()
{
Add(new Item
{
Name = "Item One"
});
Add(new Item
{
Name = "Item Two"
});
Add(new Item
{
Name = "Item Three"
});
}
}
查看模型:
public class ItemViewModel : MvvmHelpers.BaseViewModel
{
public ItemViewModel()
{
Items = new ItemData();
}
List<Item> items;
public List<Item> Items
{
get { return items; }
set { SetProperty(ref items, value); }
}
public void TestUpdateCell()
{
Items[0].Name = "Item One Updated";
}
}
项目页面 cs:
public class ItemPage : ContentPage
{
ItemViewModel ivm;
public ItemPage()
{
BindingContext = ivm = new ItemViewModel();
}
void ItemTapped(object sender, ItemTappedEventArgs e)
{
ivm.TestUpdateCell();
}
}
itempage.XAML:
ListView
ItemsSource="{Binding Items}"
ItemTapped="ItemTapped" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<view:MyItemView/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView
我的项目视图:
<ContentView
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MyProject;assembly=MyProject"
x:Class="MyProject.MyItemView">
<local:CardFrame
IsClippedToBounds="True"
HasShadow="True" >
<StackLayout
Spacing="0"
Orientation="Horizontal">
<Grid
RowSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<local:MyLabel
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="4"
FontSize="18"
FontAttributes="Bold"
Text="{Binding Name}"/>
<!-- omitted rows and columns -->
</Grid>
</StackLayout>
</local:CardFrame>
</ContentView>
如果我没看错的话,您现在已经在包含项目的列表中实施了 属性 更改机制。当您想更改 项中的值时。
实施 属性 更改(也)在 Item
class 中。
如果要动态添加和删除单元格,请将它们放在 ObservableCollection
中。但又一次;重要的是要注意这里;只观察列表本身的变化,而不是列表项内部的变化。