2014-07-10 3 views
-1

observable 컬렉션을 사용하여 내 UI를 업데이트하려고하지만 내 경우에는 발생하지 않습니다. 심지어 "Gui 스레드에 데이터 마샬링"을 사용하여 업데이트하려고했으나 작동하지 않습니다. 나를 위해. 내 코드를 updatig 여기 내게 어디 잘못 생각하는지 알려 주시기 바랍니다. XAMLObservableCollection ObservableCollection GUI를 업데이트하지 않습니다

<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'라는 이름의 뷰 모델 클래스를가집니다. 뷰 모델에서 MVVM에 대해 100 % 움직이는'LblMessageForFiles' UI 컨트롤을 처리하고 있으므로 MVVM에 대해 전혀 알지 못합니다. 프로젝트를 계속하기 전에 WPF 및 MVVM에 대한 독서 및 학습으로 돌아가는 것이 좋습니다. 우리가 여기에서 당신을 도울 수있는 지식이 너무 많이 부족합니다 ... 적어도 질문을하기 전에 기초를 배워야합니다. – Sheridan

+0

@Sheridan 우리 연구에 따르면 우리가 바라는 무엇인가하고 싶다면 View의 속성을 만들고보기에 바인딩합니다. 여기 i ahev 속성 인 "LblMessageForFiles"를 사용하고 있습니다. 그러나 문제는 내가 있습니다. 새 항목 UI를 추가 한 후 UI가 새로 고침되지 않습니다. 그 밖의 내용은 언더 북 없습니다. –

+1

* 그 밖의 무엇을 당신이 이해하지 못합니다 * ... 나 ??? 농담하니? 'System.Windows.Visibility enum'은 UI와 관련이 있으며보기 모델에 속하지 않습니다. 그리고 왜'LblMessageForFiles'가 UI 요소라고 가정 했습니까? 기묘한 이유 때문에 이름에'Lbl' 접두사를 추가했기 때문에 코드가 엉망입니다. – Sheridan

답변

0

난 당신의 코드가 정말 리팩토링이 필요하다고 말하고 싶습니다. 아래 코드를 사용하여 중단 점을 BindFiles로 설정하고 상태를 추적하십시오. 그런데 ViewModel에 Visibility.Hidden과 같은 UI 관련 코드를 작성하면 안됩니다. 컨트롤의 가시성 상태를 변경하는 속성을 정의하기 만하면됩니다.

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을 사용할 이유가 없습니다. 처음부터 Observablecollection을 사용할 이유가 없습니다. 추가/제거시 전체 점이 업데이트되기 때문입니다. – stijn

+0

@Abdurrahman Köken는 답변 해 주셔서 감사하지만이 코드는 더 많은 문제를 만듭니다. 즉, 이제 코드 위젯 DataGrid를 바인딩하지 않습니다. –

+0

vishuminhas : 코드에 대한 세부 정보를 제공하지 않아 작동하지 않을 수 있습니다. 더 많은 정보를 제공해야합니다. @stijn 정말 고마워. 너에게 고마워. 나는 "리펙토링"이 무엇을 의미하는지 알지 못했다. –

관련 문제