2014-07-10 113 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非常感谢你。我非常感谢你。我不知道“重构”是什么意思。 –