【问题标题】:Bind Collection of objects to ComboBox in DataGrid SilverLight将对象集合绑定到 DataGrid SilverLight 中的 ComboBox
【发布时间】:2016-06-17 03:06:34
【问题描述】:

我有一个问题,我正在尝试将对象集合绑定到 ComboBox(数据网格中的单元格)。

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

<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:

我正在尝试在网格中显示组合框项目的描述,然后单击“保存”,获取项目的 ID(按行)

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

【问题讨论】:

    标签: .net xaml silverlight combobox datagrid


    【解决方案1】:

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

    一种选择是将视图模型指定为用户控件上的资源,并将其指定为组合框项目源的源。

    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>   
    

    如果您通过代码隐藏设置您的 DataContext,这种方法将不起作用。在这种情况下,您将需要进行元素绑定。

    【讨论】:

    • 谢谢。我发布了更新的答案。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。我发布了更新的答案。
    【解决方案3】:

    谢谢,最后我就是这样做的,而且效果很好:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2013-12-17
      • 2011-11-24
      • 2015-01-16
      • 1970-01-01
      相关资源
      最近更新 更多