我的Xamarin.Forms应用程序中的ObservableCollection有问题。我可以添加值(我可以在调试器中读取它们),但视图无法更新。
到目前为止,我已经试了很多次,但似乎没有什么能解决这个问题。
希望你能帮忙:)
下面是我的代码:
private ObservableCollection<Transaction> transactions = new ObservableCollection<Transaction>();
public ObservableCollection<Transaction> Transactions
{
get { return transactions; }
set
{
transactions = value;
OnNotifyPropertyChanged();
}
}
public class Transaction:BaseViewModel
{
private string name = null;
private string price = null;
private double numPrice = 0;
private string date = null;
public string Name
{
get
{
return name;
}
set
{
OnNotifyPropertyChanged();
name = value;
}
}
public string Price
{
get
{
return price;
}
set
{
OnNotifyPropertyChanged();
price = value;
}
}
public double NumPrice
{
get
{
return numPrice;
}
set
{
OnNotifyPropertyChanged();
numPrice = value;
}
}
public string DateTime
{
get
{
return date;
}
set
{
OnNotifyPropertyChanged();
date = value;
}
}
}
我的基本视图模型:
public class BaseViewModel : INotifyPropertyChanged
{
protected BaseViewModel()
{
}
#region Events
public event PropertyChangedEventHandler PropertyChanged;
#endregion
protected void OnNotifyPropertyChanged([CallerMemberName] string memberName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(memberName));
}
}
}
在XAML中:
<ScrollView>
<StackLayout BindableLayout.ItemsSource="{Binding Transactions}">
<BindableLayout.ItemTemplate>
<DataTemplate>
<Frame BackgroundColor="#4D4D4D" CornerRadius="10">
<StackLayout Orientation="Horizontal">
<StackLayout>
<Label Text="{Binding Name}"/>
<Label Text="{Binding DateTime}"/>
</StackLayout>
<Label Text="{Binding Price}" FontSize="20"
HorizontalOptions="EndAndExpand" VerticalOptions="CenterAndExpand" Margin="0,0,10,0" />
</StackLayout>
</Frame>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ScrollView>
先谢了
编辑:这就是我更新收藏的方式:
public void AddTransaction(string name, double price, DateTime dateTime)
{
Transactions.Add(new Transaction()
{
Name = name,
Price = ($"-{price}€".Replace('.',',')),
NumPrice = price,
DateTime = dateTime.ToString("dd.MM.yyyy")
});
}
2条答案
按热度按时间p8ekf7hl1#
您可能遗漏了片段中的相关代码,但我猜您是在替换整个集合而不是更新它。从
Transactions
属性中删除getter并确保成员transactions
是只读的。“Observable”与集合的 * 内容 * 相关,而不是示例本身。hl0ma9xz2#
请尝试以下操作,看看是否有效:
如果 * CollectionView * 能更好地满足您的需要,您还可以将我的示例中的 ListView 替换为 CollectionView。
重要提示
不要忘记更改所有属性设置器中的顺序,例如:
备选
为了确保视图得到更新,可以做的另一件事是在添加项时对集合调用
OnNotifyPropertyChanged()
:从技术上讲,这在ObservableCollection上不应该是必要的,但问题可能与将 BindableLayout 附加到 StackLayout 有关,就像您的示例中的情况一样。