【问题标题】:WPF, MVVM datagrid row bindingWPF、MVVM 数据网格行绑定
【发布时间】:2011-07-12 04:59:53
【问题描述】:

如果有人可以帮助我解决我遇到的绑定问题,我正在徘徊?

代码片段:

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

以上是视图中的sn-p代码:

列表中的每个人都是自己的视图模型,代码如下:sn-p:

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

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

现在我遇到的问题是 SelectedValue 绑定不起作用,我不知道为什么?但是使它变得棘手或不同(也许)的是数据网格中的每一行都有自己的 viewmodel ,因此换句话说就是视图模型的数据网格。那么发生的事情是 FirstName 和 LastName 以及 Combobox 都正确填写,但我似乎无法让 SelectedValue 绑定? 附言这不是因为一些拼写错误,如果有拼写错误是因为我在写问题时重命名了方法等。

更多细节:

上面的数据网格是一个视图的一部分,它有自己的视图模型,这个视图模型用一个人列表填充上面的数据网格,每个人本质上都是一个视图模型(它不是真正的视图模型,但又是它的更多的是视图模型而不是平面模型)。在我尝试绑定 SelectedView 属性之前,它会按照我需要的方式工作吗?

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

提前致谢:D

【问题讨论】:

  • SelectedMode 绑定模式需要两种方式吗?您是否触发了属性更改事件?
  • 我尝试设置 selectedMode,但这没有做任何事情(默认情况下不是双向的),是的,它应该触发属性更改事件,但我会尝试在某些地方强制它,看看会发生什么:)
  • 模式默认为单向。您的代码没有显示任何 INotifyPropertyChanged 的​​实现,所以我不确定。
  • 哦,真的谢谢,我现在解决了,但谢谢

标签: c# wpf mvvm binding


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我发现 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      相关资源
      最近更新 更多