在UWP项目中,我有:1页,1个usercontrol和1个viewmodel。
该页面包含一个SplitView,用户控件加载在窗格中:
<SplitView.Pane>
<local:MyUserControl />
</SplitView.Pane>
页面和用户控件都具有相同的datacontext:视图模型(称为MyPageViewModel)。 ViewModel有一个ObservableCollection对象,如:
public ObservableCollection<MyModel> Commands { get; set; }
在按钮点击事件的代码隐藏页面中,我创建了一个List:
List<MyModel> ListCommands;
在我加载一些数据的地方,然后我直接从ViewModel调用一个方法,如:
(this.DataContext as MyPageViewModel).Load(listCommands);
Load是View Model中定义的一个方法,它填充了ObservableCollection:
public void Load(List<MyModel> commands)
{
Commands = new ObservableCollection<MyModel>(commands);
}
此ObservableCollection在运行时成功加载,但用户控件中的ItemsControl不显示用户控件代码中的数据(就好像用户界面未发生通知更改):
<UserControl.DataContext>
<ViewModels:RestaurantDetailsViewModel />
</UserControl.DataContext>
...
<ItemsControl ItemsSource="{Binding Commands}"
Grid.Row="1" />
ItemsControl保持为空(我使用DataTemplate显示内部MyModel属性)。我也用ListView测试过,但结果是一样的。
注意:我的viewmodel继承自实现INotifyPropertyChanged的自定义类:
public class MyPageViewModel : BindabelBase
public abstract class BindableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged([CallerMemberName]string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void Set<T>(ref T storage, T value, [CallerMemberName()]string propertyName = null)
{
if (!object.Equals(storage, value))
{
storage = value;
this.RaisePropertyChanged(propertyName);
}
}
}
答案 0 :(得分:0)
感谢所有快速解答,问题解决了。
我的错误是重新声明了DataContext的页面和用户控件,创建了ViewModel的新实例(=数据上下文对于页面和用户控件不同,两个différents实例)。
解决方案是向用户控件指示页面的datacontext,如下所示:
<local:MyUserControl DataContext="{Binding DataContext, ElementName=CommandesPage}" />
其中CommandesPage是页面的名称。