2012-09-22 5 views
0

모니터링 용 동적 탭을 설정하고 INotifyPropertyChanged 인 여러 "ID"개체를 호스트하는 프로젝트가 있으며 더미 응용 프로그램에서 개별적으로 테스트합니다. 그러나, 바인딩에서 제대로 작동하는 응용 프로그램에서 작동하도록 할 수 없습니다. 설정되어 있습니다. 즉 :양방향 바인딩이 작동하지 않을 수 있습니다.

(Configuration.Identities is an ObservableCollection<Identity>) 
foreach (Identity id in Configuration.Identities) 
{ 

    workTab = new TabItem(); 
    workSettingsTab = new SettingsTabItem(); 

    workTab.DataContext = id; 
    Binding workTabHeaderBinding = new Binding("Username"); 
    workTabHeaderBinding.Converter = new ToLowerConverter(); 
    workTab.SetBinding(TabItem.HeaderProperty, workTabHeaderBinding); 

    workSettingsTab.DataContext = id; 
    Binding workSettingsTabHeaderBinding = new Binding("Username"); 
    workSettingsTabHeaderBinding.Converter = new ToUpperConverter(); 
    workSettingsTab.SetBinding(TabItem.HeaderProperty, workSettingsTabHeaderBinding); 

위의 내용은 일방적 인 방식이므로 잘 작동합니다. 위의 컨트롤에서의 DataContext에서 참조 신원 객체가 실제로 변경된 값을 포함 않습니다, 내 저장 루틴을 디버깅 할 때 내가 발견

workSettingsTab.txtUsername.DataContext = id; 
Binding usernameBinding = new Binding("Username"); 
usernameBinding.Mode = BindingMode.TwoWay; 
workSettingsTab.txtUsername.SetBinding(TextBox.TextProperty, usernameBinding); 

Binding getJournals = new Binding("LoadJournals"); 
scrapeJournals.Mode = BindingMode.TwoWay; 
workSettingsTab.chkScrapeJournals.DataContext = id; 

workSettingsTab.chkScrapeJournals.SetBinding(CheckBox.IsCheckedProperty, scrapeJournals); 

하지만 내가 사용하는 ObservableCollection에있는 하나 그러나이 두 단지 하나의 방식으로 작동 위 foreach에서 업데이트되지 않습니다. 따라서 어떻게 든 Identity 객체는 foreach 중에 DataContext 속성을 설정하는 데 처음 사용 된 객체에서 복사됩니다. 여기서 내가 뭘 잘못하고 있니?

+2

[데이터 템플릿] (http://msdn.microsoft.com/en-us/library/ms742521.aspx)을주의 깊게 살펴 봐야하며, 그 코드는 모두 불필요합니다. –

+0

그리고'UserName' 속성의 setter에서'PropertyChanged ("UserName")'을 제기하고 있습니까? – McGarnagle

+0

예, NotifyPropertyChanged ("사용자 이름");이 실행됩니다. 이상한 부분은 DataContext 속성 내부의 객체가 변경되었지만 어떤 이유로 원본이 변경되지 않는다는 것입니다. 나는 또한 템플릿이없는 이유 인 하나 이상의 객체에 바인딩합니다. 속성을 단일 래퍼/뷰 모델 클래스와 템플릿으로 통합하는 것이 가장 좋을까요? : P – Daniel

답변

0

오른쪽. 나는이 의미를 얻을 수는 없지만, 지금까지 :

 ObservableCollection<SwitchClass> col2 = new ObservableCollection<SwitchClass>(); 
     col2.Add(new SwitchClass{theSwitch=false}); 
     col2.Add(new SwitchClass{theSwitch=true}); 
     col2.Add(new SwitchClass{theSwitch=false}); 
     col2.Add(new SwitchClass{theSwitch=true}); 

     customTab cTab; 
     Int32 z = 0; 
     Binding b; 
     foreach (SwitchClass s in col2) 
     { 
      cTab = new customTab(); 
      cTab.theCheckbox.DataContext = s; 
      b = new Binding("theSwitch"); 
      b.Mode = BindingMode.TwoWay; 
      cTab.SetBinding(CheckBox.IsCheckedProperty, b); 
      cTab.Header = "Tab " + z.ToString(); 
      z++; 
      tabControl.Items.Add(cTab); 
     } 

이 작동하지 않습니다,하지만 :

 ObservableCollection<SwitchClass> col2 = new ObservableCollection<SwitchClass>(); 
     col2.Add(new SwitchClass{theSwitch=false}); 
     col2.Add(new SwitchClass{theSwitch=true}); 
     col2.Add(new SwitchClass{theSwitch=false}); 
     col2.Add(new SwitchClass{theSwitch=true}); 

     customTab cTab; 
     Int32 z = 0; 
     foreach (SwitchClass s in col2) 
     { 
      cTab = new customTab(); 
      cTab.DataContext = s; 
      cTab.Header = "Tab " + z.ToString(); 
      z++; 
      tabControl.Items.Add(cTab); 
     } 

완벽하게

<CheckBox Name="theCheckbox" Width="200" Height="50" Content="Checkbox" IsChecked="{Binding theSwitch}" /> 

작품

와 함께. 이 WPF 제한 사항일까요?

관련 문제