使用視圖模型的方法,你可以這樣定義
<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;
這應該讓示例工作。
你將DataGrid綁定到什麼地方?我建議你有一個視圖模型綁定到視圖與一些數據項,其中這些項目有一個名爲「選中」或「選定」的屬性。然後,你將綁定該複選框對該屬性,你不必訴諸代碼隱藏。 – 2012-03-21 20:39:56
感謝您的回放:它充滿了來自domaincontext的加載操作。但問題是,我可能想要選擇所有行,並通過單擊一次按鈕將複選框設置爲true。我可以用後面的代碼來做到嗎? – Arni 2012-03-21 20:58:49
是的,如果你有你的視圖模型中的所有項目。這是創建一個你綁定你的按鈕的命令的問題。然後,在視圖模型中,遍歷PagedCollectionView中的所有項目,並將它們的「Selected」屬性(或稱爲它的任何對象)設置爲true。隨着INotifyPropertyChanged它將從那裏工作。 – 2012-03-21 21:32:42