4

3 つの FrameworkElementFactory オブジェクト ( 2 つの子 ( CheckBoxTextBox )が追加されたStackPanel )を使用してコードでDataTemplateが作成されるListBoxがあります。ListBoxのItemsSourceにバインドされたコレクション内の項目オブジェクトは、基本的に、通常はListControlの任意の型で表示されるものと同じ型の Item オブジェクトです。私がやろうとしているのは、 DataTemplateのCheckBoxIsCheckedプロパティをItem オブジェクトのブール値プロパティにバインドすることです。リストボックス単一選択、複数選択、複数チェックの 3 つのモードをサポートします。実装しようとしているモードはマルチチェックであるため、 CheckBoxのIsCheckedプロパティは項目オブジェクトのSelectedプロパティにバインドされます。これにより、WPF ListBoxItemの IsSelected プロパティが true の場合ではなく、 ListBoxItemのCheckBoxIsCheckedプロパティが true の場合にのみ項目が選択されていると見なされる動作が作成されます。データ オブジェクトの boolean プロパティを IsChecked プロパティにバインドする必要があり、IsChecked プロパティが変更されると、アイテム オブジェクトのSelectedプロパティが更新されるため、舞台裏の SelectedItemsコレクション。

先ほど説明した簡略化されたコードを次に示します。

ListBox innerListBox = new ListBox();
//The ItemsSource of the ListBox being set to the collection of items            
this.innerListBox.ItemsSource = this.Manager.ItemManagers;
this.innerListBox.ItemTemplate = this.GetMultipleCheckTemplate();    

public System.Windows.DataTemplate GetMultipleCheckTemplate()  
{  
    DataTemplate dt = new DataTemplate;  

FrameworkElementFactory factorySP = new FrameworkElementFactory(typeof(StackPanel));  

FrameworkElementFactory factoryCB = new FrameworkElementFactory(typeof(CheckBox));      
factoryCB.SetBinding(CheckBox.IsCheckedProperty, new Binding("Selected");  

RoutedEventHandler clickHandler = new RoutedEventHandler(ItemCheckBox_Click);  
factoryCheckBox.AddHandler(CheckBox.ClickEvent, clickHandler, true);   

factorySP.AppendChild(factoryCB);  

FrameworkElementFactory factoryTB = new FrameworkElementFactory(typeof(TextBlock));    
factoryTB .SetBinding(TextBlock.TextProperty, new Binding("Description");  

factorySP.AppendChild(factoryTB);   

template.VisualTree = factorySP;    
return template;  
}

CheckBoxのイベント ハンドラーである、含めていないコードがいくつかあります。Wpf ListBoxに複数の選択がある場合、範囲内のすべての CheckBox が、クリックされた CheckBox の値に切り替えられます。Item の Selected プロパティを送信者の IsChecked プロパティに手動で設定すると、すべて正常に動作しますが、データバインディングは機能するはずであり、これを手動で行う必要はないと思います。この場合のデータバインディングは非同期になりますか、それとも明示的に何かをする必要がありますか?

4

0 に答える 0