WPF-刷新绑定到ViewModel的ListView

WPF-刷新绑定到ViewModel的ListView,wpf,listview,mvvm,listviewitem,Wpf,Listview,Mvvm,Listviewitem,我正在编写一个应用程序,遇到了一个ListView问题,它显示视图模型中的项目;在所说的视图模型“Selected”中有一个属性,它只是一个bool,我将它绑定到ListView的“IsSelected”属性 我有一个“清除选择”按钮,它会迭代每个被选择的项目,并将其设置为false;这会起作用,命令会更新,按钮不再启用,因为在Selected==true中没有任何内容 在照片中 项目被选中;按钮可用 按下“清除选择”按钮 此时,我无法再单击控件来选择元素;我必须控制点击它取消选择它,这将把

我正在编写一个应用程序,遇到了一个ListView问题,它显示视图模型中的项目;在所说的视图模型“Selected”中有一个属性,它只是一个bool,我将它绑定到ListView的“IsSelected”属性

我有一个“清除选择”按钮,它会迭代每个被选择的项目,并将其设置为false;这会起作用,命令会更新,按钮不再启用,因为在
Selected==true
中没有任何内容

在照片中

项目被选中;按钮可用

按下“清除选择”按钮

此时,我无法再单击控件来选择元素;我必须控制点击它取消选择它,这将把一切都恢复为禁用,没有选择

这里是控件的XAML-不确定我可能做错了什么,但到目前为止我无法找到答案

<ListView ItemsSource="{Binding AssignableItems, UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" SelectionMode="Extended">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem" BasedOn="{StaticResource lviStyleBase}">
            <Setter Property="IsSelected" Value="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Created" DisplayMemberBinding="{Binding ContactCreated}" Width="Auto" />
            <GridViewColumn Header="Contact Name" DisplayMemberBinding="{Binding ContactName}" Width="Auto" />
            <GridViewColumn Header="Company" DisplayMemberBinding="{Binding Company}" Width="Auto" />
        </GridView>
    </ListView.View>
</ListView>

以下是ViewModel:

namespace CSI.ViewModels
{
公共类分配模型
:ModelBase
{
#区域属性
私有布尔视图过滤器;
公共布尔滤波
{
获取{return viewingFilters;}
设置{if(SetValue(ref viewingFilters,value))Notify();}
}
私有布尔赋值;
公共布尔赋值
{
获取{返回赋值;}
设置{if(SetValue(ref赋值,value))Notify();}
}
私有字符串viewTitle=“分配”;
公共字符串视图标题
{
get=>$“{viewTitle}{(已筛选?”(已筛选)”:“)}”;
}
私有AssignFilterValuesModel过滤器;
公共赋值过滤器ValuesModel过滤器
{
获取{返回筛选器;}
set{SetValue(ref filters,value);}
}
公共图书馆
{
得到
{
if(filters==null)返回false;
return assignables.Count()!=AssignableItems.Count();
}
}
私人布尔装载;
公共布尔装载
{
获取{返回加载;}
设置{SetValue(参考加载,值);}
}
私人可观测集合不可转让物;
公共可观测集合可分配项
{
得到
{
if(assignables==null)返回null;
if(Filters==null)返回可分配项;
var retval=可转让资产,其中(x=>1==1);
if(Filters.derals.Any(x=>x.Selected))
retval=retval.Where(x=>filters.derators.Where(o=>o.Selected)。选择(o=>o.Key)。ToList()包含(x.derator));
if(Filters.VehicleModels.Any(x=>x.Selected))
retval=retval.Where(x=>filters.VehicleModels.Where(o=>o.Selected)。选择(o=>o.Key)。ToList()包含(x.VehicleModel));
返回新的ObservableCollection(retval);
}
set=>SetValue(参考可分配项,值);
}
选择私人可观测集合;
公共可观测集合SelectedItems
{
get=>选中;
set=>SetValue(所选参考,值);
}
#端区
#区域命令
专用继电器命令显示过滤器屏幕;
public void Execute\u DisplayFilters(对象)
{
过滤=真;
}
public bool CanExecute\u DisplayFilters(对象)=>!筛选;
公共中继命令显示筛选器
{
get=>displayFilterScreen??(displayFilterScreen=new RelayCommand(执行显示过滤器,CanExecute显示过滤器));
}
私人RelayCommand应用过滤器;
public void执行\应用过滤器(对象)
{
过滤=!过滤;
通知(可转让项目的名称);
通知(姓名(过滤));
通知(姓名(查看标题));
}
公共bool CanExecute_ApplyFilters(object)=>过滤;
公共中继命令应用筛选器
{
get=>applyFilters??(applyFilters=new RelayCommand(执行\u applyFilters,CanExecute\u applyFilters));
}
专用中继命令doAssign;
公共无效执行\u分配(对象\u)
{
UserSelectWindow us=新的UserSelectWindow();
us.Owner=Application.Current.MainWindow;
ViewModelServer.UserSelectVM.Prompt=“选择要将这些项目分配给的用户”;
}
公共bool CanExecute\u Assign(object\u)=>!筛选和(bool)AssignableItems?.Any(x=>x.Selected);
公共中继命令分配
{
get=>doAssign??(doAssign=newrelaycommand(Execute\u Assign,CanExecute\u Assign));
}
专用中继命令选择;
公共无效执行(对象)
{
可分配项?.Where(x=>x.Selected).ToList().ForEach(x=>x.Selected=false);
}
public bool CanExecute\u ClearSelection(object\u)=>(bool)AssignableItems?.Any(x=>x.Selected);
公共关系委员会选举
{
get=>clrSelection??(clrSelection=newrelaycommand(Execute\u ClearSelection,CanExecute\u ClearSelection));
}
#端区
#区域构造函数
#端区
}
}

解决方案是为SelectedIndex添加绑定,并在调用ClearSelection时将值设置为-1;来自

的提示能否为视图模型提供代码,因为仅从XAML无法确定实际问题是什么。除此之外,您还可以从
ItemsSource
中删除
UpdateSourceTrigger=PropertyChanged
,并将
作为该doe选择