WPF-刷新ListView绑定到ViewModel

问题描述

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

我有一个“清除选择”按钮,它遍历选中的每个项目并将其设置为false。这样可以正常工作,并且命令会更新,并且不再启用按钮,因为Selected == true中没有任何内容

图片

已选择项目;按钮可用。

Item is selected; buttons are available.

按下“清除选择”按钮

Clear Selection is pressed

这时,我无法再单击控件以选择元素;我必须控制单击它才能取消选择它,这会使所有内容恢复为禁用状态,并且什么也没有选择。

这里是控件的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
{
    public class Assignviewmodel
        : ModelBase
    {
        #region Properties
        private bool viewingFilters;

        public bool Filtering
        {
            get { return viewingFilters; }
            set { if ( SetValue(ref viewingFilters,value) ) Notify(); }
        }

        private bool assigning;

        public bool Assigning
        {
            get { return assigning; }
            set { if ( SetValue(ref assigning,value) ) Notify(); }
        }

        private string viewTitle = "Assign";
        public string ViewTitle
        {
            get => $"{viewTitle}{(Filtered ? " (filtered)" : "")}";
        }

        private AssignFilterValuesModel filters;

        public AssignFilterValuesModel Filters
        {
            get { return filters; }
            set { SetValue(ref filters,value); }
        }

        public bool Filtered
        {
            get
            {
                if ( filters == null ) return false;

                return assignables.Count() != AssignableItems.Count();
            }
        }

        private bool loading;

        public bool Loading
        {
            get { return loading; }
            set { SetValue(ref loading,value); }
        }

        private ObservableCollection<AssignableWorkItemmodel> assignables;
        public ObservableCollection<AssignableWorkItemmodel> AssignableItems
        {
            get
            {
                if ( assignables == null ) return null;
                if ( Filters == null ) return assignables;

                var retval = assignables.Where(x => 1 == 1);

                if ( Filters.Dealers.Any(x => x.Selected) )
                    retval = retval.Where(x => filters.Dealers.Where(o => o.Selected).Select(o => o.Key).ToList().Contains(x.Dealer));

                if ( Filters.VehicleModels.Any(x => x.Selected) )
                    retval = retval.Where(x => filters.VehicleModels.Where(o => o.Selected).Select(o => o.Key).ToList().Contains(x.VehicleModel));

                return new ObservableCollection<AssignableWorkItemmodel>(retval);
            }
            set => SetValue(ref assignables,value);
        }
        private ObservableCollection<AssignableWorkItemmodel> selected;
        public ObservableCollection<AssignableWorkItemmodel> SelectedItems
        {
            get => selected;
            set => SetValue(ref selected,value);
        }
        #endregion
        #region Commands
        private RelayCommand displayFilterScreen;
        public void Execute_displayFilters(object _)
        {
            Filtering = true;
        }
        public bool CanExecute_displayFilters(object _) => !Filtering;
        public RelayCommand displayFilters
        {
            get => displayFilterScreen ?? (displayFilterScreen = new RelayCommand(Execute_displayFilters,CanExecute_displayFilters));
        }

        private RelayCommand applyFilters;
        public void Execute_ApplyFilters(object _)
        {
            Filtering = !Filtering;
            Notify(nameof(AssignableItems));
            Notify(nameof(Filtered));
            Notify(nameof(ViewTitle));
        }
        public bool CanExecute_ApplyFilters(object _) => Filtering;
        public RelayCommand ApplyFilters
        {
            get => applyFilters ?? (applyFilters = new RelayCommand(Execute_ApplyFilters,CanExecute_ApplyFilters));
        }

        private RelayCommand doAssign;
        public void Execute_Assign(object _)
        {
            UserSelectwindow us = new UserSelectwindow();
            us.Owner = Application.Current.MainWindow;

            viewmodelServer.UserSelectVM.Prompt = "Select the user you wish to assign these items to";
        }
        public bool CanExecute_Assign(object _) => !Filtering && (bool)AssignableItems?.Any(x => x.Selected);
        public RelayCommand Assign
        {
            get => doAssign ?? (doAssign = new RelayCommand(Execute_Assign,CanExecute_Assign));
        }

        private RelayCommand clrselection;
        public void Execute_ClearSelection(object _)
        {
            AssignableItems?.Where(x => x.Selected).ToList().ForEach(x => x.Selected = false);
        }
        public bool CanExecute_ClearSelection(object _) => (bool)AssignableItems?.Any(x => x.Selected);
        public RelayCommand ClearSelection
        {
            get => clrselection ?? (clrselection = new RelayCommand(Execute_ClearSelection,CanExecute_ClearSelection));
        }
        #endregion
        #region Constructors
        
        #endregion
    }
}

解决方法

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

的提示