我是C#的新手,并尝试开发
Windows 10 UWP应用程序作为业余爱好项目.
MainBrowser.XAML的一部分
<GridView x:Name="browserPane" ItemsSource="{x:Bind fileInCurrentFolderList,Mode=OneWay}" SelectionChanged="browserPane_SelectionChanged" Margin="0,48,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中触发更新.
我怎么能改变这个?
解决方法
发生的事情是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)); } } }
您可以像之前那样初始化声明中的支持字段,或者只是在构造函数中初始化属性.只需确保绑定到属性而不是绑定字段.此外,如果要分配新对象,请确保对属性执行此操作,以便可以广播更改.基本上,不要与支持字段交互,只需通过属性执行所有操作.