2011-12-16 11 views
0

チェックボックスをオンにしていますが、チェックボックスを複数選択する必要がありますが、リスト項目のハイライトバーは単一選択です。下記のコードでは、チェックボックスは複数選択されていますが、リストボックスにハイライトバーが表示されず、リストボックスから現在選択されているアイテムを確認することもできません。 (lbProtocols.SelectedItemsは常に0です)チェックリストボックスにハイライト表示されている項目がありません

何が欠けていますか?ここで

は、リストボックスのためのXAMLです:

<ListBox Name ="lbProtocols" ItemsSource="{Binding AvailableProtocols}"> 
    <ListBox.ItemTemplate> 
    <HierarchicalDataTemplate> 
     <CheckBox Content="{Binding ProtocolName}" IsChecked="{Binding IsChecked}" /> 
    </HierarchicalDataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

そして、ここでは、その背後にあるコードは、リストボックスに私の観察可能なコレクションをバインドしている:ここでは

public ObservableCollection<CheckedListItem> AvailableProtocols; 

    AvailableProtocols = new ObservableCollection<CheckedListItem>(); 
    CheckedListItem item1 = new CheckedListItem(0, "first", false); 
item1.IUPropertyChanged += new PropertyChangedEventHandler(item_IUPropertyChanged); 
    CheckedListItem item2 = new CheckedListItem(1, "second", true); 
item2.IUPropertyChanged += new PropertyChangedEventHandler(item_IUPropertyChanged); 
    CheckedListItem item3 = new CheckedListItem(3, "third", false); 
item3.IUPropertyChanged += new PropertyChangedEventHandler(item_IUPropertyChanged); 
    AvailableProtocols.Add(item1); 
    AvailableProtocols.Add(item2); 
    AvailableProtocols.Add(item3); 

lbProtocols.ItemsSource = AvailableProtocols; 

はCheckedListItemクラスです:

public class CheckedListItem : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    public event PropertyChangedEventHandler IUPropertyChanged; 

    public CheckedListItem(){ } 
    public CheckedListItem(int id, string name, bool check) 
    { 
     ID = id; 
     ProtocolName = name; 
     IsChecked = check; 
    } 

    public int ID { get; set; } 
    public string ProtocolName { get; set; } 

    private bool _IsChecked; 

    public void SetCheckedNoNotify(bool check) 
    { 
     _IsChecked = check; 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); 
    } 

    public bool IsChecked 
    { 
     get { return _IsChecked; } 
     set 
     { 
      _IsChecked = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); 
      if (IUPropertyChanged != null) 
       IUPropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); 
     } 
    } 
} 
+0

設定だろうか?また、コードビハインドからItemsSourceを設定している場合は、XAMLでバインディングを設定する必要はありません。 –

答えて

1

問題は、ListBoxItemでチェックボックスを使用する際の一般的な問題です。チェックボックスはclickイベントを処理しているので、リストボックスはアイテムを選択したことを通知されません。各項目の横にあるテキストの右にあるをクリックすると、その行が選択された状態になります。

私が提案できる最善の解決策は、あなたが今すぐテキストをクリックすると、リストボックス内の項目を選択し、この

<DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
        <CheckBox IsChecked="{Binding IsChecked}" /> 
        <TextBlock Text="{Binding ProtocolName}" /> 
        </StackPanel> 
       </DataTemplate> 

のようなあなたのDataTemplateを分割することです。あなたが選択になるために、チェックボックスをクリックし、アイテムを起こしたい場合には、分離コードのチェックボックス項目のためのPropertyChangedにバインドする必要があり、その後、あなたがHeirarchicalDataTemplate代わりにするDataTemplateを使用している理由がある

lbProtocols.SelectedItem = sender 
+0

甘い!これは、item_IUPropertyChangedハンドラでlbProtocols.SelectedItemを手動で設定するだけの、私が思いついた解決策より優れています。私はあなたのソリューションの機能が好きです。ありがとう! –

関連する問題