WPF,MVVM数据网格行绑定

时间:2011-07-12 04:59:53

标签: c# wpf mvvm binding

如果有人能帮我解决我遇到的约束问题,我会徘徊吗?

代码片段:

<DataGrid AutoGenerateColumns="False" Grid.Column="1" Grid.Row="1" SelectionMode="Single" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding PersonList}" CanUserSortColumns="True" SelectedItem="{Binding Path=SelectedPerson}" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="FirstName" Width="100" Binding="{Binding FirstName}" />
                <DataGridTextColumn Header="LastName" Width="100" Binding="{Binding LastName}" />
                <DataGridTemplateColumn Width="140" Header="Operator">
                    <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                        <ComboBox ItemsSource="{Binding Path=OperatorList}" DisplayMemberPath="FullName" SelectedValue="{Binding Path=SelectedOperator}" />
                            </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn> 
                ...
</DataGrid>

以上是视图中的一段代码:

列表中的每个人都有自己的viewmodel,其中包含以下代码段:

CollectionView _operatorList;
public CollectionView DebtorAgentList { get { return _operatorList; } }

Model.Operator _selectedOperator;
public Model.Operator SelectedOperator
{...}

现在我遇到的问题是SelectedValue绑定无法正常工作,我无法理解为什么?但令它变得棘手或不同(可能)的是,数据网格中的每一行都有自己的视图模型,因此在其他方面是视图模型的数据网格。所以正在发生的是FirstName和LastName以及Combobox都被正确填充但我似乎无法让SelectedValue绑定? 附:这不是因为一些拼写错误,如果有拼写错误是因为我在写这个问题时重命名了方法等。

进一步详情:

上面的Datagrid是一个拥有自己的viewmodel的视图的一部分,这个视图模型用一个人的列表填充上面的数据网格,每个人本质上都是一个视图模型(好吧它实际上不是一个视图模型,但它又是它的更多的是一个视图模型,而不是一个平面模型)。它按照我需要的方式工作,直到我尝试绑定SelectedView属性?

有人可以告诉我为什么绑定可能不起作用?

提前致谢:D

2 个答案:

答案 0 :(得分:0)

使用SelectedValuePath,然后使用'SelectedValue'选择集合中的任何项目,请参阅以下代码: -

<ComboBox ItemsSource="{Binding Path=OperatorList}" DisplayMemberPath="FullName" SelectedValuePath="SelectedOperator" SelectedValue="{Binding SelectedOperator}" />   

答案 1 :(得分:0)

我发现this article帮助我解决了问题:)  而不是使用模板列我使用了DataGridComboBoxColumn,如下所示:

<DataGrid AutoGenerateColumns="False" Grid.Column="1" Grid.Row="1" SelectionMode="Single" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding PersonList}" CanUserSortColumns="True" SelectedItem="{Binding Path=SelectedPerson}" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="FirstName" Width="100" Binding="{Binding FirstName}" />
            <DataGridTextColumn Header="LastName" Width="100" Binding="{Binding LastName}" />
            <DataGridComboBoxColumn Header="Operator" DisplayMemberPath="FullName" Width="150" SelectedValueBinding="{Binding Path=SelectedOperator}" >
                <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding Path=OperatorList}" />
                </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=OperatorList}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
            ...
</DataGrid>

其余的都保持不变, 谢谢大家:))