2011-12-15 3 views
0

내가 무엇을 가지고 :목록 개체 바인딩 - 목록 항목 컨트롤 내에서 모델 목록을 변경

나는 모델 객체가 ObservableCollectionJobTask 's의 목록을 보유하고 Job라는이 -의이 taskList를 부르 자 . 내가 ItemsControl - (System.Windows.Controls.ItemsControl) taskList에 바인딩되어있어 표시합니다. ItemsControl.TemplateDataTemplate을 사용자 정의로 설정하여 표시됩니다. UserControl -이 작업을 jobTask와 관련된 UIControls가있는 JobTaskDisplayPanel이라고합니다. 제목, 설명, iscomplete 등이 있습니다.이 설정은 현재 작동하고 있으며 ItemsControl 내에 바운드 정보가있는 JobTaskDisplayPanel의 목록을 표시합니다.

샘플 코드 :

ItemsControl에 XAML :이 바인딩 방법

 <ItemsControl ItemsSource="{Binding}" Name="jobsTaskList"> 
      <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ucs:JobTaskDisplayPanel Margin="4"/> 
        </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

(나는 코드에서 바인딩) :

jobsTaskList.ItemsSource = currentJob.taskList; 

내가 원하는 무엇 :

JobTaskDisplayPanel의 각각에서 taskList (모델 목록)을 변경하는 방법을 알고 싶습니다. 특히 JobTaskDisplayPanel의 각 부분에 '삭제'버튼을 넣고 싶습니다. 부모의 taskList에서 JobTask을 삭제하여 응용 프로그램 모델에서 제거하십시오.

답변

1

난 당신이

this.Parent.RemoveTask(this); 

갈 수 또는 I는 프리즘의 EventAggregator로의 EventSystem 어떤 종류의 사용을 만들 것, 그래서 JobTask는 속성이와 관련 된 Job를 참조하는 것이다 Parent라고 한 당신이 중 하나를 것 또는 MVVM Light의 Messenger입니다. 이 경우 사용자의 JobTask은 소유하고있는 메시지를 제거하라는 메시지를 브로드 캐스팅하고 Job 개체는 이러한 메시지를 수신하기 위해 구독하고 이벤트 메시지에있는 JobTask이 있으면 제거합니다.

+0

예, 부모 참조 방법을 사용했습니다. 그것은 일을하는 아주 더러운 방법처럼 느껴집니다. 이 상황을 개선하기위한 첫 번째 아이디어는 부모 UserControl의 코드 숨김 메소드에 바인딩하거나 상위 DataContext에서 메소드를 더 잘 호출 할 수있는 능력을 갖는 것입니다. – user989056

+0

@ user989056 'JobTask'는 그것이'Job '이 무엇인지를 알기 때문에 Parent 속성에 문제가없는 것을 볼 수 있습니다. 부모님이 UI를 탐색하거나 해킹하는 것처럼 들리므로 원한다면 아마'Job'과 같은 것으로 이름을 바꿀 수 있습니다. – Rachel

0

ItemsControl을 사용하고 있으므로 ListBox에서와 마찬가지로 단추를 클릭 할 때 SelectedIndex 또는 SelectedItem을받지 못합니다. 이렇게하면 항목이 삭제해야하는 항목 컬렉션을 관리하는 DataContext에 알려야합니다.

패널에 삭제 버튼을 추가하면됩니다. 항목의 DataContext에 새 이벤트를 만들고 OnDelete와 같은 이름을 지정하십시오. OnDelete 이벤트를 발생시키고 자신을 보낸 사람으로 전달할 항목의 메서드에 단추의 명령을 바인딩합니다. jobTasksList가있는 부모 DataContext는이 이벤트를 처리하고 ItemsControls Items 컬렉션에서이 이벤트를 제거해야합니다. 이벤트의 객체 발신자를 아이템 클래스로 캐스팅 한 후에 아이템을 찾을 수 있습니다.

명령 매개 변수로 사용하는 Delete 메서드로 항목을 전달할 수도 있지만 이미 항목 컬렉션을 관리자에게 알릴 필요가 있으므로 항목을 삭제해도 실제로는 아무 것도 구입하지 않습니다.

+0

당신이 말한 것을 어떻게 구현할 수 있을지 이해하지 못합니다. 어쩌면 용어가 혼란 스러울 수도 있습니다. "항목의 DataContext에 새 이벤트를 만들고 이름을 OnDelete와 같이 지정하십시오." 항목의 DataContext 란 무엇입니까? 'JobTaskDisplayPanel' 또는 그것이 나타내는 Model 클래스의 코드 인'JobTask'에 대해 이야기하고 있습니까? – user989056

+0

그것은 가난한 단어 중 하나였습니다. 아이템 컬렉션이 어떤 클래스이든 상관 없습니다. 따라서 항목이 JobTask 객체의 모음 인 경우 JobTask에서 OnDelete 이벤트를 추가해야합니다. ItemsSource가 JobTaskDisplayPanel 컬렉션이면 JobTaskDisplayPanel에 있어야합니다. – Josh

관련 문제