Here's我正在使用的代码。在xaml
中,我像这样扩展了ListView
:
<ListView x:Name="lv" ItemsSource="{Binding}">
<ListView.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding Edit}" CommandParameter="{Binding SelectedItem, ElementName=lv}"/>
<KeyBinding Key="Return" Command="{Binding Edit}" CommandParameter="{Binding SelectedItem, ElementName=lv}"/>
</ListView.InputBindings>
</ListView>
并在INotifyPropertyChanged
类中实现了Master
,以便在编辑项目时查看ListView
中的更新。在Person
类中,我又添加了一个Command
public Command Edit { get; set; }
通过构造将其初始化:
Edit = new Command(CanClick, EditItem);
并实现了这样的回调:
bool CanClick(object arg) => Count > 0;
void EditItem(object obj) {
if(obj != null{
var item = obj as Master;
item.FirstName = "Edited";
item.LastName = "Edited";
SetItem(IndexOf(item), item);
}
}
当我选择一个项目并按 Return 时,它会更新集合,但ListView
中没有任何变化。如果我双击某个项目,则它既不会更新收藏集,也不会更新ListView
!
另一个问题是,为什么我必须为ListView
设置一个名称,以便在嵌套InputBindings
中使用,就像这样ElementName=lv
?我可以摆脱它吗?
编辑
如果我进一步像这样展开ListView
:
<ListView x:Name="lv" ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="First Name" Width="200"
DisplayMemberBinding="{Binding FirstName}"/>
<GridViewColumn Header="Last Name" Width="200"
DisplayMemberBinding="{Binding LastName}" />
</GridView>
</ListView.View>
<ListView.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding Edit}" CommandParameter="{Binding SelectedItem, ElementName=lv}"/>
<KeyBinding Key="Return" Command="{Binding Edit}" CommandParameter="{Binding SelectedItem, ElementName=lv}"/>
</ListView.InputBindings>
</ListView>
ListView
反映了我通过void EditItem(object obj)
进行的更新,但MouseBinding
也不以这种方式工作。为什么有人将这样的单个属性绑定为一个集合?
答案 0 :(得分:1)
没有理由致电SetItem
来更新项目。
只要Master
类正确实现INotifyPropertyChanged
,设置属性就足够了。
在处理双击时,您可以添加对System.Windows.Interactivity的引用并使用EventTrigger
:
<ListView x:Name="lv" ItemsSource="{Binding}" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding Edit}" CommandParameter="{Binding SelectedItem, ElementName=lv}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<ListView.View>
<GridView>
<GridViewColumn Header="First Name" Width="200" DisplayMemberBinding="{Binding FirstName}"/>
<GridViewColumn Header="Last Name" Width="200" DisplayMemberBinding="{Binding LastName}" />
</GridView>
</ListView.View>
</ListView>