2012-03-21 3 views
2

안녕 루프에 노력하고있는 데이터 그리드에서 체크 박스에 체크 의미있는 데이터에 캐스팅하는 방법을 알아내는 것 누구든지 저를 도울 수 있습니까?나는 행을 통해 루프를 필요로하고 내가 사용하는 경우 데이터 그리드 의 행을 통해 실버

내가 작업을 수행 다음에서 보았다 ...

IEnumerable list = dataGrid.ItemsSource as IEnumerable; 
foreach (var row in list) 
{} 

내가 같은 개체와 같은 문제를 얻을하지만 혼합 데이터입니다 같은 느낌 :

내가 사용하는 경우 프레젠테이션 있음

PagedCollectionView pgView = verkefniDataGrid.ItemsSource as PagedCollectionView; 
foreach (var item in pgView) 
{ 
((CheckBox)verkefniDataGrid.CurrentColumn.GetCellContent(item)).IsChecked = true; 
} 

항목 뒤에있는 데이터로 이동하여 실제로 설정하는 방법이 있습니까?

+0

DataGrid를 바인딩 할 대상은 무엇입니까? 나는이 아이템들이 "Checked"또는 "Selected"라는 속성을 가진 몇몇 데이터 아이템으로 뷰에 바인딩 된 뷰 모델을 제안했다. 그런 다음 해당 속성에 대해 확인란을 바인딩하면 코드 숨김에 의존 할 필요가 없습니다. –

+0

재생 해 주셔서 감사합니다. domaincontext의 loadoperation으로 채워져 있습니다. 그러나 모든 것은 하나의 버튼 클릭으로 모든 행을 선택하고 확인란을 true로 설정하려고 할 수 있습니다. 내가 뒤에있는 코드로 그걸 할 수 있을까? – Arni

+0

예,보기 모델에 모든 항목이있는 경우 단추를 바인딩 할 명령을 작성해야합니다. 그런 다음 뷰 모델에서 PagedCollectionView의 모든 항목을 반복하고 "Selected"속성 (또는 호출 된 항목)을 true로 설정합니다.INotifyPropertyChanged를 사용하면 거기에서 작동합니다. –

답변

0

뷰 모델 접근 방식을 사용하면의 속성을 포함하는 뷰 모델,에 대해 구속하도록 설정, 다음 뷰를이

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel Orientation="Vertical"> 
    <sdk:DataGrid AutoGenerateColumns="False" Height="151" HorizontalAlignment="Left" Margin="52,67,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="190" 
        ItemsSource="{Binding Items}"> 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridCheckBoxColumn Binding="{Binding IsSelected}"/> 
      <sdk:DataGridTextColumn Binding="{Binding Name}"/> 
     </sdk:DataGrid.Columns> 

    </sdk:DataGrid> 
    <Button Content="What is selected?" Width="300" Click="Button_Click"/> 
    </StackPanel> 
</Grid> 

같은 뷰를 정의 할 수 있습니다 당신의 PagedCollectionView : 내가 아니라, 내가 추한의 조각을 넣어 솔루션을 알 수 없기 때문에 지금

public class ViewModel 
{   
    private PagedCollectionView _items = new PagedCollectionView(
       new[] 
       {new MyItem{Name="Item 1"}, 
       new MyItem{Name="Item 2"}, 
       new MyItem{Name="Item 3"}, 
       new MyItem{Name="Item 4"} }); 

    public PagedCollectionView Items 
    { 
     get { return _items; } 
    } 

    public string GetSelectedItems() 
    { 
     return "Selected items: " + 
       string.Join(",", 
        Items.Cast<MyItem>().Where(x => x.IsSelected). 
         Select(x => x.Name)); 
    } 
} 

, 코드 코드 숨김 단지 선택 추적하는 것이 방법을 보여줍니다 :

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var viewModel = DataContext as ViewModel; 
    MessageBox.Show(viewModel.GetSelectedItems()); 
} 

이보기를 연결 및 뷰 모델이 함께보기, 뷰 모델을 생성하여 수행 한 다음의 DataContext에 속성과 함께 스티치 전망. 마찬가지로 :

var view = new MyWindow(); 
var viewModel = new ViewModel(); 
view.DataContext = viewModel; 

그 예제를 작동시켜야합니다.

+0

고마워요. 제 12 장을 전문가에게 읽어 주어야합니다. Silverlight 4로 비즈니스 애플리케이션 MVVM을 아직 공부하지 않았으므로 :) – Arni

+0

안녕하세요. 당신의 모범을 보여 주려고했습니다. DataGrid가 바인딩 된 Items 속성은 Arni

+0

안녕 Ami입니다. View, UserControl을 만들 때 ViewController의 인스턴스에 DataContext를 할당합니다. 위의 예제를 추가했습니다. –

1

체크 상자 컨트롤을 확인하려면 바운드 된 항목을 통해서가 아니라 iterate through the DataGrid's rows이 필요합니다. 행을 반복하면서 적절한 열의 체크 박스를 잡고 속성을 설정해야합니다.

그러나 주석에 언급 된 것처럼 체크 상자가 그리드 뒤의 데이터 속성에 바인딩되어 있으면 해당 값을 변경할 수 있어야합니다 (항목이 INotifyPropertyChanged 인터페이스를 노출하는 한).

편집 업데이트 링크

+0

안녕 브라 이언트 DataGrid의 행 속성을 찾고 있었지만 내 데이터 그리드에 존재하지 않았어 : 어떻게 그럴 수 :) 오류 '행'에 대한 정의가 'System.Windows.Controls.DataGrid'에 포함되어 있지 않습니다. 및 'System.Windows.Controls.DataGrid'형식의 첫 번째 인수를 받아들이는 확장 메서드 '행'을 찾을 수 없습니다 (사용 지시문이나 어셈블리 참조가 누락 되었습니까?) – Arni

+0

VS-2010을 사용하고 있습니다. 지금까지 Rows 속성이 부족하다는 것을 설명 할 수있는 것은 무엇입니까? – Arni

+0

죄송합니다. WinForms 답변에 대한 링크였습니다. Silverlight 링크를 업데이트했지만 어쨌든 더 나은 옵션 인 MVVM 경로를 사용하는 것보다 더 많은 작업이 될 것입니다. – Bryant