2014-07-10 144 views
-1

我想更新我的UI使用可觀察集合,但我沒有發生在我的情況下,即使我試圖更新它使用「編組數據到Gui線程」,即使不工作對我來說。在這裏我更新了我的代碼,請讓我知道我錯了。 XAMLObservableCollection不更新圖形用戶界面

<DataGrid ItemsSource="{Binding BindFiles, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single"  CanUserSortColumns="False" x:Name="dataGrid1" BorderBrush="Transparent" Canvas.Left="1" Canvas.Top="50" Background="{Binding ElementName=gd,Path=Background}"></datgrid> 

財產

 ObservableCollection<ProjectTabModel> _BindFiles; 
     public ObservableCollection<ProjectTabModel> BindFiles 
     { 
      get 
      { 
       return _BindFiles; 
      } 
      set 
      { 
       _BindFiles = value; 
       RaisePropertyChanged(()=>BindFiles); 
      } 
     } 

視圖模型

#region BindProjectFiles 
     public void Bindfiletab() 
     { 

      List<ProjectTabModel> obj = ProjectTabModel.FilesBinding(GlobalProjectID); 
      ObservableCollection<ProjectTabModel> obsrvbl = new ObservableCollection<ProjectTabModel>(obj); 

      if (obsrvbl.Count > 0) 
      { 

       BindFiles.Clear(); 
       foreach (var item in obsrvbl) 
       { 
        BindFiles.Add(item); 
       } 

      } 
      else 
      { 

       NoFileFound = "No File found"; 
      } 
     } 



private class DragOverEvent : ProjectTabViewModel, ICommand 
     { 
      public event EventHandler CanExecuteChanged; 
      public void Execute(object sender) 
      { 
       GalaSoft.MvvmLight.Threading.DispatcherHelper.CheckBeginInvokeOnUI(() => 
     { 
//my code stuff here 
      } 
     }); 
} 
+3

你的代碼是一團糟。你有一個視圖模型類,它也是一個'ICommand',但被命名爲'... Event'。您正在處理視圖模型中的'LblMessageForFiles' UI控件,該控件對MVVM的效率爲100%,因此您清楚*不知道MVVM。我建議您在繼續項目之前回頭閱讀並學習WPF和MVVM。你錯過了太多的知識來幫助你在這裏......至少在你問這裏問題之前,你需要學習基礎知識。 – Sheridan

+0

@Sheridan根據我的研究,如果我們想要做什麼與視圖我們使它的屬性,並在視圖中綁定它也是這裏我的ahev屬性「LblMessageForFiles」,我正在使用。但問題,我是facig是在添加任何新的條目UI之後不會刷新。還有什麼不是沒有理解的。 –

+1

*你還有什麼不瞭解* ...我???你在開玩笑? 'System.Windows.Visibility enum'是UI相關的,並且* not *屬於你的視圖模型。爲什麼我假設'LblMessageForFiles'是一個UI元素?因爲一些奇怪的原因,你再給名稱添加一個'Lbl'前綴......你的代碼就是一團糟。 – Sheridan

回答

0

我想說的是,你的代碼確實需要重構。用下面的代碼更改代碼,將斷點設置爲BindFiles並跟蹤其狀態。順便說一下,您不應該在您的ViewModel中編寫與UI相關的代碼,例如Visibility.Hidden。只需定義一個屬性即可更改控制的可見性狀態。

public void BindFileTab() 
{ 
     List<ProjectTabModel> obj = ProjectTabModel.FilesBinding(GlobalProjectID); 
     BindFiles = new ObservableCollection<ProjectTabModel>(obj); 
     LblMessageForFiles = Visibility.Hidden; 
     if (BindFiles.Count > 0) 
     { 
      LblMessageForFiles = Visibility.Hidden;     
     } 
     else 
     { 
      LblMessageForFiles = Visibility.Visible; 
      NoFileFound = "No File found"; 
     } 
    } 
+0

由於您談論重構,請使用'var'而不是拼寫出完整的類型,並且適當的變量名稱也不會傷害。除此之外,我不確定這段代碼是否會有所作爲,或者甚至是ObservableCollection的使用方式。您只需將屬性後面的後端交換到這裏,所以沒有理由首先使用Observablecollection,因爲整個過程都在獲取有關添加/刪除的更新。 – stijn

+0

@AbdurrahmanKöken謝謝你的回答,但是這段代碼產生了更多的問題,即現在停止將代碼綁定到datagrid。 –

+0

vishuminhas:由於您沒有提供有關您的代碼的詳細信息,因此可能無效。你應該提供更多信息。 @stijn非常感謝你。我非常感謝你。我不知道「重構」是什麼意思。 –