XAML ObservableCollection没有更新,我做错了什么?

nhn9ugyo  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(132)

我的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")
        });

    }
p8ekf7hl

p8ekf7hl1#

您可能遗漏了片段中的相关代码,但我猜您是在替换整个集合而不是更新它。从Transactions属性中删除getter并确保成员transactions是只读的。“Observable”与集合的 * 内容 * 相关,而不是示例本身。

hl0ma9xz

hl0ma9xz2#

请尝试以下操作,看看是否有效:

<ScrollView>
        <ListView ItemsSource="{Binding Transactions}">
            <ListView.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>
            </ListView.ItemTemplate>
        </ListView>
    </ScrollView>

如果 * CollectionView * 能更好地满足您的需要,您还可以将我的示例中的 ListView 替换为 CollectionView

重要提示

不要忘记更改所有属性设置器中的顺序,例如:

public string Name
    {
        get
        {
            return name;
        }
        set
        {
            if(name == value) return;
            name = value;
            OnNotifyPropertyChanged();
        }
    }

备选

为了确保视图得到更新,可以做的另一件事是在添加项时对集合调用OnNotifyPropertyChanged()

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")
        });
        OnNotifyPropertyChanged(nameof(Transactions));
    }

从技术上讲,这在ObservableCollection上不应该是必要的,但问题可能与将 BindableLayout 附加到 StackLayout 有关,就像您的示例中的情况一样。

相关问题