我有一个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”模式绑定时,这怎么可能?
答案 0 :(得分:0)
在我看来,它发生是因为你在ViewModel中将SelectedItem绑定到Product属性,在listView中选择了一个项目后,它将通过listView.SelectedItem传递对Product属性的引用,因此你将获得对您在Products集合中拥有的相同对象。之后,您正在使用TwoWay绑定(TextBoxes)并更改Product的属性,这将通过引用自动将这些更改反映到listView。