0

在这堂课中:

 [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");
    }

我错了什么??

4

2 回答 2

3

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 提供了一个基于 lambda 的覆盖NotifyOfPropertyChange,您应该使用它来捕获重构
  3. PropertyChanged实现 INPC 属性的更好模式如下(这是因为更改属性以调用事件不再是消费者的责任)

采用:

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。这可以防止消费者需要检查以避免空引用异常。

于 2013-04-05T11:06:38.677 回答
-1

这是 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 改变Articles 列表中的一项并调用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!为什么 ?

于 2013-04-05T15:27:20.037 回答