【问题标题】:ListView select multiple items programmatically in MVVMListView 在 MVVM 中以编程方式选择多个项目
【发布时间】:2019-12-17 04:27:32
【问题描述】:

如何从带有 MVVM 模式的代码中选择几行到 ListView 中?

我使用的 ListView 是由一个已经不在的队友制作的

public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register("SelectedItemsList" , typeof(IList) , typeof(SrListView) , new PropertyMetadata(null));

(...)
public IList SelectedItemsList
        {
            get
            {
                return ( IList )GetValue(SelectedItemsListProperty);
            }
            set
            {
                SetValue(SelectedItemsListProperty , value);
            }
        }

(...)

private void SrListView_SelectionChanged(object sender , SelectionChangedEventArgs e)
        {
            SelectedItemsList = SelectedItems;
        }

我像这样使用这个列表视图:

<CustomListView SelectionMode="Extended"
                ItemsSource="{Binding ocPackages}"
                SelectedItem="{Binding objSelectedPackage}"
                SelectedItemsList="{Binding ilSelectedPackages, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
</CustomListView>
        private IList _ilSelectedPackages; // = new ArrayList()
        public IList ilSelectedPackages
        {
            get
            {
                return _ilSelectedPackages;
            }
            set
            {
                _ilSelectedPackages = value;
                OnPropertyChanged(nameof(ilSelectedPackages));
            }
        }
ilSelectedPackages.Clear();
ilSelectedPackages.Add(objDTO_PackageToSelect);

我尝试清除然后填充 ilSelectedPackages 但这对 ListView 的选择没有影响:(

我找到了这个主题Managing multiple selections with MVVM,但我无法解决我的问题:(

编辑 1:“Multiselect ListBox”主题并不能帮助我解决我的问题,因为它默认没有在 ListViews 中实现,在我的问题中我说明这是一个自制的ListView,以及如何将“SelectedItemsList”添加到默认的ListView中。

编辑 2: 看了这个答案https://stackoverflow.com/a/51254960/10617386 后,我尝试通过“BindableTwoWay”行为修改自制的 ListView 组件没有成功

public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register("SelectedItemsList", typeof(IList), typeof(SrListView), new FrameworkPropertyMetadata(default(IList),
                                                  FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedItemsListChanged));

(...)

private static void OnSelectedItemsListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
     if (d is SrListView ListView)
          ListView.SetSelectedItems(ListView.SelectedItemsList);
}

感谢您的帮助

【问题讨论】:

  • “但我无法解决我的问题” - 您是否尝试过 accepted answer 或者您无法解决的问题?除非您详细说明为什么不能使用提供的解决方案,否则您的问题是重复的,必须关闭。
  • 您好 Sinatr,感谢您的回答,是的,我已经尝试过了,但它对我不起作用,如果我记得清楚,当我通过在 double 中添加对象来最大化 Window 时,这会产生一个错误在 ilSelectedPackages :(
  • 当您对选定项目具有集合类型依赖属性时,您需要附加一个 CollectionChanged 事件处理程序,如下所示,例如在这里:stackoverflow.com/a/9128855/1136211。或在这里:stackoverflow.com/a/15023687/1136211
  • @Clemens 感谢您的回答,您的意思是我必须将我的 IList (ilSelectedPackages) 订阅到 CollectionChanged 事件?
  • Multiselect ListBox的可能重复

标签: c# wpf listview mvvm data-binding


【解决方案1】:

我终于找到了解决方案,问题不在于我最初想到的自制组件(我没有在正确的区域搜索),而只是在我选择对象时:

ilSelectedPackages.Add(objDTO_PackageToSelect);

objDTO_PackageToSelect 是一个对象的副本,因此不是来自填充 ListView 的 ObservableCollection 的 ocPackages。

结论:我们必须选择Binded observable集合的确切对象。

DTO_Package objPackInOC = ocPackages.Where(Pack => Pack.sGuid == objDTO_PackageToSelect.sGuid).FirstOrDefault();

if(objPackInOC != null)
     ilSelectedPackages.Add(objPackInOC);

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 1970-01-01
    • 2010-10-08
    • 2010-11-07
    • 1970-01-01
    • 2013-12-25
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多