如何将行详细信息的控件绑定到视图模型的属性

时间:2014-10-24 01:31:38

标签: c# wpf xaml silverlight

在我的开发工作中,我想创建一个包含行详细信息的数据网格。每一行都包含一个班级信息,如班级名称和学生总数。当用户单击一行时,会将所选类的所有学生信息显示在行详细信息中。

行详细控件也由数据网格组成,此网格的每一行都是学生信息。

可以使用AutoCompleteBox控件编辑学生姓名。它的ItemSource应该绑定到ViewModel的属性StudentNames而不是ClassInformation的属性。 ClassInforamtion也是ViewModel的一个属性。但结果并不奏效。在编辑过程中,StudentNames目前没有绑定。

<UserControl ...>
   <Grid x:Name="LayoutRoot" ...>
        <sdk:DataGrid 
                  AutoGenerateColumns="False" 
                  ItemsSource="{Binding ClassInformation}"  
                  RowDetailsVisibilityMode="VisibleWhenSelected"
                  SelectedItem="{Binding SelectedClass, Mode=TwoWay}"
                  x:Name="dataGrid">
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <sdk:DataGridTextColumn Header="Total Student" Binding="{Binding TotalStudent}" IsReadOnly="True"/>
            </sdk:DataGrid.Columns>
            <sdk:DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <sdk:DataGrid AutoGenerateColumns="False" Grid.Column="0" ItemsSource="{Binding StudentInformation}">
                            <sdk:DataGrid.Columns>
                                <sdk:DataGridTemplateColumn Header="Student Name">
                                    <sdk:DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <TextBlock x:Name="studentName" Text="{Binding SSDTestScript.Name}"/>
                                        </DataTemplate>
                                    </sdk:DataGridTemplateColumn.CellTemplate>
                                    <sdk:DataGridTemplateColumn.CellEditingTemplate>
                                        <DataTemplate>
                                            <sdk:AutoCompleteBox ItemsSource="{Binding Path=DataContext.StudentNames, ElementName="LayoutRoot"}" ItemFilter="{Binding ElementName=studentName, Path=Text}"/>
                                        </DataTemplate>
                                    </sdk:DataGridTemplateColumn.CellEditingTemplate>
                                </sdk:DataGridTemplateColumn>
                            </sdk:DataGrid.Columns>
                        </sdk:DataGrid>
                    </Grid>
                </DataTemplate>
            </sdk:DataGrid.RowDetailsTemplate>
        </sdk:DataGrid>
    </Grid>
</UserControl>

我也试过或绑定过表达式。

ItemsSource="{Binding Path=ScriptNames}" DataContext="{Binding}" 
ItemsSource="{Binding Path=ScriptNames, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}"
ItemsSource="{Binding Path=ScriptNames, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"

顺便问一下,如何在Silverlight 5中指定AncestorLevel?我试过这个表达式,但是当我导航到页面时它会抛出异常。它取决于xaml的逻辑树吗?

ItemsSource="{Binding Path=ScriptNames, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=2}}"

任何建议将不胜感激!提前谢谢。

0 个答案:

没有答案