奇怪的ListView.SelectedValue绑定问题(至少对我而言)

时间:2012-03-14 19:50:44

标签: c# binding mvvm .net-4.0

我有一个ListView,它有绑定数据,还有两个额外的绑定:

    <ListView x:Name="listViewProducts" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" ItemsSource="{Binding Products}" IsSynchronizedWithCurrentItem="True" 
              SelectedItem="{Binding Path=Product, Mode=OneWayToSource}" SelectedIndex="{Binding Path=SelectedProductIndex, Mode=OneWayToSource}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="100" DisplayMemberBinding="{Binding ID}" />
                <GridViewColumn Header="Name" Width="170" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Price" Width="100" DisplayMemberBinding="{Binding Price}" />
                <GridViewColumn Header="Reseller" Width="Auto" DisplayMemberBinding="{Binding Reseller}" />
            </GridView>
        </ListView.View>
    </ListView>

像这样,我在ViewModel中拥有必要的Product属性。我还有4个文本框,例如:

    < TextBox Grid.Row="0" Grid.Column="1" x:Name="txtName" ... 
        Text="{Binding Text, Path=Product.Name, Mode=TwoWay}" />

这就是我想要实现的目标:  我想只在用户点击如下定义的按钮时更新一个监听:

    <Button Grid.Row="0" Grid.Column="2" x:Name="btnUpdate" .... 
       Content="Update product" 
       Command="{Binding Path=Update_Command}" 
       CommandParameter="{Binding ElementName=listViewProducts, Path=SelectedIndex}" />

这就是发生的事情:每当我在listView中选择一个项目时,文本框都会获得正确的属性。当我更改其中一个文本框并选择另一个文本框时,模型会立即更新。当选择项与“OneWaytoSource”模式绑定时,这怎么可能?

1 个答案:

答案 0 :(得分:0)

在我看来,它发生是因为你在ViewModel中将SelectedItem绑定到Product属性,在listView中选择了一个项目后,它将通过listView.SelectedItem传递对Product属性的引用,因此你将获得对您在Products集合中拥有的相同对象。之后,您正在使用TwoWay绑定(TextBoxes)并更改Product的属性,这将通过引用自动将这些更改反映到listView。