ListView无法与ObservableCollection一起正常使用

时间:2019-10-14 02:04:19

标签: wpf .net-core

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也不以这种方式工作。为什么有人将这样的单个属性绑定为一个集合?

1 个答案:

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