将对象集合绑定到DataGrid SilverLight中的ComboBox

时间:2016-03-03 16:48:25

标签: .net xaml silverlight combobox datagrid

我遇到了问题,我想将对象集合绑定到ComboBox(数据网格中的单元格)。

我的网格中有ComboBox,但它是空的,没有数据(Collection不为空):

<sdk:DataGrid Name="CdnsDataGrid" AutoGenerateColumns="False" Grid.Column="1" Grid.Row="1" Height="200" RowHeight="40" Margin="0,20,30,20"  RowEditEnded="LinesDataGrid_RowEditEnded">
        <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn Width="*" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Welcome Message">
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>

                        <ComboBox Name="VoiceMessagesComboBox" SelectedIndex="3" Width="250"  ItemsSource="{Binding VMCollection}" SelectionChanged="OnVMSelectionChanged">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid Width="200" Height="46">
                                        <TextBlock HorizontalAlignment="Center" Text="{Binding Description}"/>
                                    </Grid>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>

                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
                <sdk:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>

                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellEditingTemplate>

            </sdk:DataGridTemplateColumn>
            </sdk:DataGrid.Columns>
            </sdk:DataGrid>      
</Grid>

Collection项目包含:ID,Path,Description:

我试图在网格中显示组合框项目的描述,并且&#34; save&#34;单击,获取项​​目的ID(按行)

任何想法,如何解决? 谢谢。

3 个答案:

答案 0 :(得分:1)

由于您的ComboBox位于DataGrid中,因此它位于该DataGrid的上下文中。看起来您正在访问ViewModel上的集合,因此您需要指定源。

一种选择是在您的用户控件上将View Model指定为资源,并将其指定为ComboBox ItemSource的源。

xmlns:vm="clr-namespace:My.App.ViewModels"


<UserControl.Resources>
    <vm:MyViewModel x:Key="myViewModel"/>
</UserControl.Resources>

<sdk:DataGrid Name="CdnsDataGrid" AutoGenerateColumns="False" Grid.Column="1" Grid.Row="1" Height="200" RowHeight="40" Margin="0,20,30,20"  RowEditEnded="LinesDataGrid_RowEditEnded">
        <sdk:DataGrid.Columns>
        <sdk:DataGridTemplateColumn Width="*" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Header="Welcome Message">
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>

                        <ComboBox Name="VoiceMessagesComboBox" SelectedIndex="3" Width="250"  ItemsSource="{Binding VMCollection,  Source={StaticResource myViewModel}}" SelectionChanged="OnVMSelectionChanged">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid Width="200" Height="46">
                                        <TextBlock HorizontalAlignment="Center" Text="{Binding Description}"/>
                                    </Grid>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>

                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
                <sdk:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>

                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellEditingTemplate>

            </sdk:DataGridTemplateColumn>
            </sdk:DataGrid.Columns>
</sdk:DataGrid>   

如果您通过Code Behind设置DataContext,则此方法不起作用。在这种情况下,您需要进行元素绑定。

答案 1 :(得分:0)

ComboBox将当前集合项(&#39; row&#39;)作为数据上下文,但集合位于VM中。您可以为绑定指定相对源并将其指向父DataGrid(数据上下文为VM):

<ComboBox Name="VoiceMessagesComboBox" SelectedIndex="3" Width="250"
          ItemsSource="{Binding DataContext.VMCollection, RelativeSource={RelativeSource FindAncestor, AncestorType=sdk:DataGrid}}" 
          SelectionChanged="OnVMSelectionChanged">

答案 2 :(得分:0)

谢谢,最后这就是我做到的,它的确有效:

<ComboBox Height="23" Name="cbxFuelType" SelectionChanged="cbxFuelType_SelectionChanged" ItemsSource="{StaticResource VMCollection}">                                                       
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Grid Width="200" Height="46">
                                        <TextBlock HorizontalAlignment="Center" Text="{Binding Description,Mode=TwoWay}"/>
                                    </Grid>
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>

现在,我需要按ID显示描述,当加载DataGrid时。 任何的想法?