繁体   English   中英

如何更新datagrid列表c#wpf caliburn.micro

[英]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"> ...

其他要点:

  1. List不是您的文章列表的非常好的属性名称
  2. Caliburn.Micro为NotifyOfPropertyChange提供了一个基于lambda的覆盖,您应该使用它来捕获重构
  3. 实现INPC属性的更好模式如下(这是因为更改属性以调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM