2014-12-09 3 views
0

내 애플리케이션이 현재 REST 요청을하고 일부 JSON을 비 직렬화 한 다음 ObservableCollection 비동기에 항목을 추가합니다 (UI 스레드의 항목을 뺀). ICommand 대리자를 단추에 바인딩 할 때 작업에서 컬렉션을 수정하려고하면 UI에 반영되지 않지만 '임시'대리자 인 Execute()에서는 수행합니다.ICommand Delegate 액션에서 콜렉션 수정 UI가 업데이트되지 않음

내 ProjectViewModel (DataContext에)

public class ProjectViewModel : INotifyPropertyChanged 
{ 
    public DelegateCommand AddProject { get; set; } 
    public DelegateCommand OnLoad { get; set; } 

    private ObservableCollection<Project> m_Projects; 
    public ObservableCollection<Project> Projects 
    { 
     get { return m_Projects; } 
     set 
     { 
      m_Projects = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Projects")); 
     } 
    } 

    private CoreDispatcher MainDispatcher = null; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public ProjectViewModel() 
    { 
     MainDispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.Dispatcher; 
     Projects = new ObservableCollection<Project>(); 

     OnLoad = new DelegateCommand(
      async (p) => 
      { 
       await GetProjectsAsync(); 

       //Test = Works! 
       Projects.Insert(0, new Project() { Name = "Steve" }); 
      }, 
      () => { return true; } 
     ); 

     OnLoad.Execute(null); 


     AddProject = new DelegateCommand(
      (p) => 
      { 
       Projects.Insert(0 , new Project() { Name = "Test", Key = "Test", Avatar = null }); 
      }, 
      () => { return true; } 
     ); 

     //Test = Works! 
     AddProject.Execute(null); 
    } 

XAML 버튼 : <Button Margin="232,0,0,583" Content="Search" Background="White" Foreground="Black" Width="158" Command="{Binding AddProject}"/>

의 GridView :

 <GridView x:Name="ProjectListView" Margin="0,107,0,0" VerticalAlignment="Top" Width="400" ItemsSource="{Binding Projects, Mode=TwoWay}" ItemTemplate="{StaticResource ProjectTemplate}" Height="533"> 
     <GridView.DataContext> 
      <vm:ProjectViewModel/> 
     </GridView.DataContext> 
    </GridView> 

대리인은 실행 예상 나는 항목이 컬렉션에 추가되는 것을 볼 수 그러나 Debug.WriteLine을 사용하면 UI에서 대리자를 실행할 때 GridView에 표시되지 않습니다. 주목할 가치가있는 점은 CollectionChanged 이벤트가 호출된다는 것입니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까, 감사합니다 !!

+0

1) 대신에 '추가'를 사용할 때 작동합니까? 2)'GetProjectsAsync'는 무엇을합니까? 3) UI 스레드에서 '프로젝트'를 관찰 할 수 없다면 어떻게 될까요? 4) AddProject에서 매개 변수를 제거하면 어떻게됩니까? 5) 또한, 'Button'이 GridView ItemPanelTemplate 안에 있어야한다는 것을 나타내는 GridView DataCotext를 설정하고 있습니까? 어떻게 다른 방법으로 액세스 할 수 있습니까? 뷰 모델을 복제하고 있습니까? –

+0

1). 아니, 어떤 방법 (추가, 제거, 삽입 등)도 작동하지 않습니다. 2). GetProjectsAsync는 각 JSON 객체를 deserialize하여 'Projects'컬렉션에 추가하는 비동기 작업입니다. 각 항목은 MainDispatcher.RunAsync (priority, action)를 사용하여 추가되므로 항목은 UI/foreground 스레드에 추가됩니다. 3). 정확히 같은 결과는 여전히 추가/제거 할 수 없습니다. 4). 기본적으로 null이며 CommandParameters 매개 변수입니다. 나는 그것을 제거하려고합니다. 5). DataContext는 각 자식이 상속 할 수 있도록 페이지에 설정됩니다. Button.DataContext를 통해 datacontext를 추가했습니다. @ChrisEelmaa –

답변

0

DataContext가 GridView.DataContext와 Page.Resources 내의 Page에서 설정 되었기 때문에이 문제가 발생한 것으로 보입니다. 갈등이 있었어야합니다.

관련 문제