2013-04-05 41 views
0

在這個類的DataGrid C#WPF的更新列表:如何caliburn.micro

[Export(typeof(IScreen))] 
    public class BolleViewModel : Screen 
    { 
       .... 
    } 

我有這個名單:

public List<Article> List { get; private set; } 

這份名單是綁定的DataGrid列出:

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

我錯了嗎? ?

回答

3

Caliburn.Micro不支持開箱即用的DataGrid基於約定的綁定,您可以通過檢查ConventionManagerstatic constructor來查看此信息。

您可以使用ConventionManager編寫自己的約定,也可以在您的視圖中設置ItemsSource屬性綁定。

E.g.

<DataGrid ItemsSource="{Binding Articles}" SelectedItem="{Binding SelectedArticle}" 
     Margin="14,41,12,61" AutoGenerateColumns="False" 
     HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> ... 

其他景點:

  1. List是不是你的文章列表一個很好的屬性名
  2. Caliburn.Micro提供了一個基於拉姆達覆蓋爲NotifyOfPropertyChange,你應該使用捕捉重構
  3. 實現INPC屬性的更好模式如下(這是因爲它不再是消費者的責任,他們更改屬性來調用PropertyChanged甚至T)

用途:

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

由於這是一個集合類型,你也應該確保你總是返回一個集合,而不是空。這可以防止消費者需要檢查以避免空引用異常。

+0

如果我不使用caliburn.micro這個數據網格,我如何更改我的代碼? – puti26 2013-04-05 11:10:34

+0

答覆已更新。 – devdigital 2013-04-05 11:14:42

+0

好的。但不行。 我更改另一種方法中的項目列表,然後調用update方法以確保datagrid顯示新列表,但不起作用! public void Update(List

list) { Articles = list; } – puti26 2013-04-05 14:52:19

-1

這是視圖模型DataGrid的觀點:

[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改變的文章列表中的項目,並調用Update BViewModel的方法。

[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!爲什麼?