내 애플리케이션이 현재 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 이벤트가 호출된다는 것입니다.
누구나 올바른 방향으로 나를 가리킬 수 있습니까, 감사합니다 !!
1) 대신에 '추가'를 사용할 때 작동합니까? 2)'GetProjectsAsync'는 무엇을합니까? 3) UI 스레드에서 '프로젝트'를 관찰 할 수 없다면 어떻게 될까요? 4) AddProject에서 매개 변수를 제거하면 어떻게됩니까? 5) 또한, 'Button'이 GridView ItemPanelTemplate 안에 있어야한다는 것을 나타내는 GridView DataCotext를 설정하고 있습니까? 어떻게 다른 방법으로 액세스 할 수 있습니까? 뷰 모델을 복제하고 있습니까? –
1). 아니, 어떤 방법 (추가, 제거, 삽입 등)도 작동하지 않습니다. 2). GetProjectsAsync는 각 JSON 객체를 deserialize하여 'Projects'컬렉션에 추가하는 비동기 작업입니다. 각 항목은 MainDispatcher.RunAsync (priority, action)를 사용하여 추가되므로 항목은 UI/foreground 스레드에 추가됩니다. 3). 정확히 같은 결과는 여전히 추가/제거 할 수 없습니다. 4). 기본적으로 null이며 CommandParameters 매개 변수입니다. 나는 그것을 제거하려고합니다. 5). DataContext는 각 자식이 상속 할 수 있도록 페이지에 설정됩니다. Button.DataContext를 통해 datacontext를 추가했습니다. @ChrisEelmaa –