WPF - Làm mới ListView liên kết với ViewModel
Tôi đang viết một ứng dụng vào phút này và đã gặp sự cố với ListView hiển thị các mục từ Mô hình xem; có một thuộc tính trong mô hình chế độ xem đã nói "Đã chọn" chỉ là một bool và, tôi liên kết điều này với thuộc tính "Được chọn" của ListView.
Tôi có một nút để "Xóa lựa chọn" lặp lại từng mục được chọn và đặt nó thành false; điều này hoạt động và lệnh được cập nhật và các nút không còn được bật vì không có gì ở đâu Selected == true.
Trong tranh
Mục được chọn; các nút có sẵn.
Nút "Xóa lựa chọn" được nhấn
Tại thời điểm này, tôi không còn có thể nhấp vào điều khiển để chọn phần tử; Tôi phải kiểm soát nhấp vào nó để bỏ chọn nó khiến mọi thứ trở lại như bị vô hiệu hóa và không có gì được chọn.
Đây là XAML để kiểm soát - không chắc tôi có thể làm sai điều gì nhưng tôi không thể tìm thấy câu trả lời cho đến nay.
<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>
Đây là 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
}
}
Trả lời
Giải pháp là thêm một ràng buộc cho SelectedIndex và đặt giá trị thành -1 khi gọi ClearSelection; tiền boa từ đây