2012-03-21 55 views
2

你好我試圖環DataGrid中選中複選框,如果我使用:我需要遍歷行,並通過排在DataGrid 在Silverlight中

PagedCollectionView pgView = dataGrid.ItemsSource as PagedCollectionView; 
foreach (var item in pgView.) 
{} 

我獲得該項目的實體,我可以」不知道如何將其轉換爲一些有意義的數據 任何人都可以幫助我嗎?

如果我使用:

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; 
} 

是否有任何方式來獲取項目後面的數據並將其設置爲true?

+0

你將DataGrid綁定到什麼地方?我建議你有一個視圖模型綁定到視圖與一些數據項,其中這些項目有一個名爲「選中」或「選定」的屬性。然後,你將綁定該複選框對該屬性,你不必訴諸代碼隱藏。 – 2012-03-21 20:39:56

+0

感謝您的回放:它充滿了來自domaincontext的加載操作。但問題是,我可能想要選擇所有行,並通過單擊一次按鈕將複選框設置爲true。我可以用後面的代碼來做到嗎? – Arni 2012-03-21 20:58:49

+0

是的,如果你有你的視圖模型中的所有項目。這是創建一個你綁定你的按鈕的命令的問題。然後,在視圖模型中,遍歷PagedCollectionView中的所有項目,並將它們的「Selected」屬性(或稱爲它的任何對象)設置爲true。隨着INotifyPropertyChanged它將從那裏工作。 – 2012-03-21 21:32:42

回答

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

謝謝每一個,我想我需要去閱讀Pro 中的第12章使用Silverlight 4進行商業應用因爲我還沒有研究MVVM :) – Arni 2012-03-21 21:50:58

+0

嗨Per。我試圖勾畫你的榜樣。 DataGrid綁定到的Items屬性是這樣顯示的: Arni 2012-03-21 22:25:19

+0

Hi Ami。當你創建你的視圖,usercontrol時,你將它的DataContext分配給ViewModel的一個實例。我在上面添加了一個例子。 – 2012-03-22 05:44:22

1

如果你想檢查複選框控件,你需要iterate through the DataGrid's rows,而不是通過它綁定的項目。您需要循環訪問行,然後抓取正確列中的複選框並在其上設置屬性。

但正如在註釋中提到的,如果複選框綁定到網格後面的數據中的屬性,那麼您應該能夠更改該值(只要該項暴露INotifyPropertyChanged接口)。

編輯更新的鏈接

+0

您好布萊恩特我正在尋找數據網格的行屬性,但它不存在於我的數據網格:這怎麼可能:)錯誤'System.Windows.Controls.DataGrid'不包含'行'並沒有擴展方法'行'接受類型'System.Windows.Controls.DataGrid'的第一個參數可以找到(你是否缺少使用指令或程序集引用?) – Arni 2012-03-21 21:10:05

+0

我正在使用VS-2010和evrything應該是到目前爲止,有什麼可以解釋這種缺乏行屬性? – Arni 2012-03-21 22:28:22

+0

對不起,這是一個鏈接到一個WinForms的答案:)我已經更新了一個Silverlight的鏈接,但是,它可能比MVVM路線更好,無論如何這是一個更好的選擇。 – Bryant 2012-03-21 23:10:53