[英]How update List of datagrid c# wpf caliburn.micro
在这堂课:
[Export(typeof(IScreen))]
public class BolleViewModel : Screen
{
....
}
我有这个清单:
public List<Article> List { get; private set; }
此列表是Datagrid与List的绑定:
<DataGrid HorizontalAlignment="Stretch" SelectedItem="{Binding SelectedArticle}"
Margin="14,41,12,61" VerticalAlignment="Stretch" AutoGenerateColumns="False" x:Name="List">
我想在调用方法UPDATE时更新List和Datagrid的值。 这是我的更新方法:
public void Update(List<Article> list)
{
List = list;
NotifyOfPropertyChange("List");
}
我错了什么? ?
Caliburn.Micro不支持开箱即用的基于约定的DataGrid
绑定,你可以通过检查ConventionManager
静态构造函数来看到这一点。
您可以使用ConventionManager
编写自己的约定,也可以在视图中设置ItemsSource
属性绑定。
例如
<DataGrid ItemsSource="{Binding Articles}" SelectedItem="{Binding SelectedArticle}"
Margin="14,41,12,61" AutoGenerateColumns="False"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> ...
其他要点:
List
不是您的文章列表的非常好的属性名称 NotifyOfPropertyChange
提供了一个基于lambda的覆盖,您应该使用它来捕获重构 PropertyChanged
事件的消费者不再负责) 采用:
private List<Article> articles;
public List<Article> Articles
{
get
{
return this.articles;
}
private set
{
if (this.articles == value)
{
return;
}
this.articles = value;
this.NotifyOfPropertyChange(() => this.Articles);
}
}
由于这是一个集合类型,您还应该确保始终返回集合而不是null。 这可以防止消费者检查以避免空引用异常。
这是Datagrid视图的viewModel:
[Export(typeof(IScreen))]
public class BViewModel : Screen
{
private List<Article> articles;
public List<Article> Articles
{
get
{
return this.articles;
}
private set
{
if (this.articles == value)
{
return;
}
this.articles = value;
this.NotifyOfPropertyChange(() => this.Articles);
}
}
public BolleViewModel()
{
Articles = recoverArticles(); //returns a list of articles
}
public void Update(List<Article> list)
{
Articles = list;
}
//is associated with a button
public void Detail()
{
if(SelectedArticle!=null)
WindowManager.ShowWindow(new DetailArticleViewModel(SelectedArticle, Articles), null, null);
else
{
MessageBox.Show("Select an article","Error!",MessageBoxButton.OK,MessageBoxImage.Error);
}
}
}
DetailArticleViewModel更改文章列表项并调用BViewModel的Update方法。
[Export(typeof(IScreen))]
public class DetailArticleViewModel : Screen
{
public List<Article > GeneralList;
public Article ArticleSelected;
public BViewModel bw;
public DetailArticleViewModel(Article art,List<Article> arts,BViewModel viewmodel)
{
ArticleSelected = art;
GeneralList = arts;
bw = viewmodel;
}
// is associated with a button
public void Save()
{
var index = GeneralList.FindIndex(item => item.Code.CompareTo(ArticleSelected.Code)==0);
GeneralList[index].Price = 900;
bw.Update(List);
}
}
但所选文章的价格不是900! 为什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.