2009-09-23 154 views
2

我有一個列表框,它有一個複選框作爲項目模板的一部分。Silverlight ListBox複選框選定的項目

在單擊複選框時,我想確保選中相同的列表項。

ListBoxItem lbi = ((ListBoxItem)listLayers. 
         ContainerFromElement((CheckBox)sender)); 
lbi.IsSelected = true; 

說我遇到的主要問題是,「ContainerFromElement」是不是在Silverlight中可用。

任何幫助是極大的讚賞。

編輯

這是我在我的名單裏面一個複選框的Click事件中運行代碼:

MyObject obj = listLayers.SelectedItem as MyObject; 
obj.Visible = true; 
obj.Value = "50"; 

使用的RelativeSource與此代碼一起上的複選框結合,我obj等於null。

我有我想打開圖層列表和關閉通過複選框,我開到另一種方式......

+0

像在本演示中的CheckBoxList? http://designersilverlight.com/SilverlightSamples/ListBoxCheckBox/ – Sorskoot 2009-09-23 20:17:24

回答

5

在SelectionChanged事件,你必須「走」視覺樹查找複選框。你可以通過使用VisualTreeHelper

This example顯示你需要做什麼才能進入複選框。

下面是這個問題

您應該使用的RelativeSource的ListBoxItem的和複選框之間結合一些其他的解決方案。 數據表包含一個複選框。改變它看起來像這樣。

<CheckBox 
    IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, 
    Path=IsSelected, Mode=TwoWay}" /> 

這創建列表框的IsSelected特性之間的結合和器isChecked CheckBox的屬性。 This教程通過一個例子來解釋如何。

如果你需要更多的控制,你應該看看behaviors and triggers。他們有點複雜,但給你更多的控制。

+0

這看起來不錯,但要麼我沒有足夠的適用於我的情況,或者它不完全是我要找的。 – Nate 2009-09-23 19:55:19

+0

我試過這個:「」但是在Click事件處理程序中,上面的代碼最終變爲null。 – Nate 2009-09-23 20:08:24

+0

你處理在列表框或複選框的點擊? – Sorskoot 2009-09-23 20:09:40

0

保存自己的麻煩並創建複選框,將它們添加到代碼隱藏中的StackPanel,然後迭代它們,只需查找具有IsChecked.Value = True的複選框。 花了我2分鐘。

foreach(Object object in MyList){ 
    CheckBox cb1 = new CheckBox() { Content = object.MyProperty}; 
    MyStackPanel.Children.Add(cb1); 
} 
0

你也可以有一個集合,可觀察到的集合或哈希集合的代碼隱藏,併爲複選框的選中或取消選中一個方法,所以你可以添加或刪除它的工作爲我選定的對象(我沒有嘗試過堆棧面板)...

這是我做的。

首先我綁定的元素,我需要去CheckBox的標籤

<CheckBox Grid.Column="1" Margin="3" Height="50" Width="70" Visibility="Visible" 
    Tag="{Binding Id}" Checked="CheckBox_Checked" 
    Unchecked="CheckBox_Unchecked" /> 

然後在後面的代碼,我得到的ID被選中或取消選中和Im肯定是顯示,因爲是元素時我用在綁定上的是一樣的。

using System.Collections.ObjectModel; 
    private ObservableCollection<Guid> SelectedLocations = new ObservableCollection<Guid>(); 
    private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     Guid _guid = new Guid((((CheckBox)sender).Tag).ToString()); 
     if (!SelectedLocations.Contains(_guid)) 
     { 
      SelectedLocations.Add(_guid); 
     }   
    } 

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e) 
    { 
     Guid _guid = new Guid((((CheckBox)sender).Tag).ToString()); 

     if (SelectedLocations.Contains(_guid)) 
     { 
      SelectedLocations.Remove(_guid); 
     }   

    } 

看到的,所以當你完成你已經在代碼什麼的檢查列表...

0

對我來說 - 本代碼解決的目的。

<CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsSelected, Mode=TwoWay}" >