0

私は、監視用の動的タブを設定するプロジェクトを持っているため、INotifyPropertyChanged であり、ダミーアプリでテストされているように個別に動作するいくつかの「アイデンティティ」オブジェクトをホストしています。ただし、作業中のアプリでバインディングを正しく機能させることができません。それらは次のように設定されています。

(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);

おそらく一方向であるため、上記のものは正常に機能します。ただし、これら 2 つは一方向にしか機能しません。

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);

保存ルーチンをデバッグしているときに、上記のコントロールの DataContext で参照されている Identity オブジェクトには実際に変更された値が含まれていることに気付きましたが、上記の foreach で使用した ObservableCollection の値は更新されていません。したがって、どういうわけか、 foreach 中に DataContext プロパティを設定するために最初に使用されたオブジェクトから Identity オブジェクトがコピーされます。ここで何が間違っていますか?

4

1 に答える 1

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の単なる制限だと思いますか?

于 2012-09-23T00:33:38.557 に答える