C# XAML:更改ObservableCollection的实例后UI不更新

6

我是一名C#新手,尝试开发Windows 10 UWP应用作为一项爱好项目。

主要浏览器部分的XAML代码:

            <GridView x:Name="browserPane" ItemsSource="{x:Bind fileInCurrentFolderList,Mode=OneWay}" SelectionChanged="browserPane_SelectionChanged" Margin="0,48,0,0">
                <GridView.ItemTemplate>
                    <DataTemplate x:DataType="classes:Item">
                        <StackPanel Margin="10">
                            <Image Height="268" Width="200" Source="{x:Bind Thumbnail}" x:Phase="1" Stretch="UniformToFill"></Image>
                            <TextBlock Width="200" Text="{x:Bind Caption}" TextWrapping="Wrap" TextTrimming="CharacterEllipsis" MaxLines="2"/>
                        </StackPanel>
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>

这个网格视图绑定到

public sealed partial class MainBrowser : Page
{
...
private ObservableCollection<Item> fileInCurrentFolderListUI = new ObservableCollection<Item>();
...
}

这个应用程序左侧有一个按钮列表。每个按钮都会调用一个方法,返回一个 ObservableCollection<Item>

问题是我需要做类似于:

foreach (Item file in ReturnObservableCollection)
    {
    fileInCurrentFolderList.Add(item);
    }

而不是这样

fileInCurrentFolderList = ReturnObservableCollection;

为了能够触发UI中的更新。 我该如何更改这个?
1个回答

8
正在发生的是当向ObservableCollection添加或删除项目时,它会进行报告,但如果更改了集合本身(即实例化了新实例),则没有任何报告更改的内容。一种解决方案是在您的ViewModel中使用INotifyPropertyChanged接口,并报告属性的更改。
public sealed partial class MainBrowser : Page, INotifyPropertyChanged
{
    // Backing field.
    private ObservableCollection<Item> fileInCurrentFolderListUI;
    // Property.
    public ObservableCollection<Item> FileInCurrentFolderListUI
    {
        get { return fileInCurrentFolderListUI; }
        set
        {
            if (value != fileInCurrentFolderListUI)
            {
                fileInCurrentFolderListUI = value;
                // Notify of the change.
                NotifyPropertyChanged();
            }
        }
    }

    // PropertyChanged event.
    public event PropertyChangedEventHandler PropertyChanged;

    // PropertyChanged event triggering method.
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

你可以像以前一样在声明中初始化支持字段,也可以在构造函数中初始化属性。只需确保绑定到属性而不是支持字段。此外,如果您要分配一个新对象,请确保将其分配给属性,以便更改可以广播。基本上,不要与支持字段交互,只需通过属性完成所有操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接