我有一个绑定到ViewModel(MVVM)的表单。在表单内部,我有一个ItemsControl,它绑定到我的DataContext中名为projects的元素。
当我使用命令模式进行保存时,我保存项目并进行检索,然后我想将ItemsControl重新绑定到Projects集合。这部分似乎不起作用,我的所有服务调用都按预期工作,但我的视图没有反弹到添加项目的新集合,即使它从服务器返回。
对此有任何帮助真的很感激。
XAML
<ItemsControl Name="ProjectGrid"
Background="Transparent" ItemsSource="{Binding Path=Projects}" Margin="0,0,0,0" VerticalAlignment="Top"
ItemContainerStyle="{StaticResource alternatingWithTriggers}"
AlternationCount="2"
ItemTemplate="{StaticResource ItemTemplate}"/>
ViewModel
public ICommand SaveCommand
{
get
{
if (_cmdSave == null)
{
_cmdSave = new RelayCommand(Save, CanSave);
}
return _cmdSave;
}
}
public void Save()
{
MyService.Save();
PopulateModel();
}
private void PopulateModel()
{
Projects = MyService.GetProjects();
}
public ProjectDto[] Projects
{
get { return _projects; }
set
{
if (_projects == value)
return;
_projects = value;
Notify(PropertyChanged, o => Projects);
}
}
答案 0 :(得分:3)
确保您的ViewModel正在实施INotifyPropertyChanged。如果您的视图模型在属性更改时没有通知,您的ui将不会知道更改
使用调试转换器确定绑定是否失败。有一个例子here如何做到这一点。这是每个wpf开发人员都需要的技术。
我非常确定你的NotifyPropertyChanged失败了,调试转换器会告诉你某些
答案 1 :(得分:1)
正如Aran Mulholland已经说过,在ViewModel中实现INotifyPropertyChanged。 另外,尝试为集合使用ObservableCollection 而不是重置集合,尝试使用
Projects.Clear();
MyService.GetProjects().ToList().ForEach(Projects.Add);
就像提示一样,尝试使GetProjects()方法异步,因此它不会阻止UI ......