2012-03-12 5 views
2

내 코드는 다음과 같습니다.WPF의 목록 상자에있는 체크 박스에 액세스

<ListBox x:Name="lstBoxMarket" BorderThickness="0" Height="Auto" HorizontalAlignment="Center" Width="200" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"> 
    <ListBox.ItemTemplate> 
     <HierarchicalDataTemplate> 
      <CheckBox IsChecked="{Binding Checked}" CommandParameter="{Binding MarketId}" Tag="{Binding MarketId}" Content="{Binding Market}" Foreground="#FF3D66BE" Name="chkMarket"/> 
     </HierarchicalDataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

저장 버튼 클릭 목록에서 선택하거나 선택 해제 한 체크 박스에 액세스하고 싶습니다. 나는 곧바로 chkMarket에 접속할 수 없다. 누구든지 도와 줄 수 있습니까? 코드에서 시작

+2

코드에'{Binding Checked} '문을 가지고 있습니다. 즉, 뷰 모델에 바인딩하고 어딘가에 저장하는 것을 의미합니다. lstBoxMarket의 DataContext 무엇입니까? – vorrtex

답변

1

2 방향 바인딩이므로 목록 상자의 항목 소스에서 확인란에 의해 선택된 값에 액세스 할 수있었습니다. DataTable lstBoxMarketItemSourceDT = ((DataView) lstBoxMarket.ItemsSource) .ToTable();

검색된 데이터 테이블의 "선택 됨"열에 업데이트 된 확인란 값이 제공됩니다.

1

내가 그런 다음 MainWindow를에 그

    // find all T in the VisualTree 
       public static IEnumerable<T> FindVisualChildren<T>(DependencyObject parent) 
     where T : DependencyObject 
    { 
     List<T> foundChilds = new List<T>(); 

     int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < childrenCount; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i); 

      T childType = child as T; 
      if (childType == null) 
      { 
       foreach(var other in FindVisualChildren<T>(child)) 
        yield return other; 
      } 
      else 
      { 
       yield return (T)child; 
      } 
     } 
    } 

같은 시도

private void button1_Click(object sender, RoutedEventArgs e) 
    { 
          // find all checkboxes in my window 
     IEnumerable<CheckBox> myBoxes = FindVisualChildren<CheckBox>(this); 

     int numChecked = 0; 
     foreach(CheckBox cb in myBoxes) 
     { 
      if(cb.Name != "chkMarket") 
       continue; 


      if (cb.IsChecked == true) 
       numChecked++; 

     } 

     MessageBox.Show("Checked items = " + numChecked); 


    } 

내 뷰 모델 코드는 사용자가 메시지를 볼 수 있어야합니다

public class ViewModel 
{ 
    public ViewModel() 
    { 
     _persons = new ObservableCollection<Person>(); 
     _persons.Add(new Person() { Name = "Paul", Checked = false }); 
     _persons.Add(new Person() { Name = "Brian", Checked = true }); 
    } 

    private ObservableCollection<Person> _persons; 

    public ObservableCollection<Person> Persons 
    { 
     get { return _persons; } 
    } 
} 

public class Person 
{ 
    public String Name { get; set; } 
    public Boolean Checked { get; set; } 
} 

입니다 "확인 된 항목 = 1". 희망이 있습니다

+0

'VisualTreeHelper' 기회를 사용할 때마다 뭔가 잘못하고있는 것입니다. 이 경우 바인딩 된 객체를 통해 필요한 값에 쉽게 액세스 할 수 있으므로 WPF에서 컨트롤에 대한 직접 액세스가 거의 필요하지 않습니다. –

관련 문제