【问题标题】:How to set SelectedItems property of GridView in WPF using MVVM如何使用 MVVM 在 WPF 中设置 GridView 的 SelectedItems 属性
【发布时间】:2023-03-13 19:45:01
【问题描述】:

我的 wpf 应用程序中有一个 gridview,它的 xaml 如下所示:

   <ListView SelectionMode="Extended" ItemsSource="{Binding AllPartTypes}"
      local:DataGridService.SelectedItems="{Binding Path=SelectedPartTypes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <ListView.View>
            <GridView>
                some columns...
            </GridView>
        </ListView.View>
   </ListView>

这是我用来获取所选项目的附加行为:

public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.RegisterAttached(
            "SelectedItems",
            typeof(IList),
            typeof(DataGridService),
             new UIPropertyMetadata(new List<object>() as IList, OnSelectedItemsChanged));

        static SelectionChangedEventHandler GetSelectionChangedHandler(DependencyObject obj)
        {
            return (SelectionChangedEventHandler)obj.GetValue(SelectionChangedHandlerProperty);
        }
        static void SetSelectionChangedHandler(DependencyObject obj, SelectionChangedEventHandler value)
        {
            obj.SetValue(SelectionChangedHandlerProperty, value);
        }
        static readonly DependencyProperty SelectionChangedHandlerProperty =
            DependencyProperty.RegisterAttached("SelectionChangedHandler", typeof(SelectionChangedEventHandler),
            typeof(DataGridService), new UIPropertyMetadata(null));

        //d is MultiSelector (d as ListBox not supported)
        static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
        {
            if (GetSelectionChangedHandler(d) != null)
                return;

            if (d is MultiSelector)//DataGrid
            {
                MultiSelector multiselector = d as MultiSelector;
                SelectionChangedEventHandler selectionchanged = null;
                foreach (var selected in (d as DataGrid).SelectedItems) // GetSelectedItems(d) as IList)
                    multiselector.SelectedItems.Add(selected);

                selectionchanged = (sender, e) =>
                {
                    SetSelectedItems(d, multiselector.SelectedItems);
                };
                SetSelectionChangedHandler(d, selectionchanged);
                multiselector.SelectionChanged += GetSelectionChangedHandler(d);
            }
            else if (d is ListBox)
            {
                ListBox listbox = d as ListBox;
                SelectionChangedEventHandler selectionchanged = null;

                selectionchanged = (sender, e) =>
                {
                    SetSelectedItems(d, listbox.SelectedItems);
                };
                SetSelectionChangedHandler(d, selectionchanged);
                listbox.SelectionChanged += GetSelectionChangedHandler(d);
            }
        }

        public static IList GetSelectedItems(DependencyObject obj)
        {
            return (IList)obj.GetValue(SelectedItemsProperty);
        }

        public static void SetSelectedItems(DependencyObject obj, IList value)
        {
            obj.SetValue(SelectedItemsProperty, value);
        }

当用户单击按钮或其他东西时,这适用于在视图模型中获取所选项目。我的问题是,当屏幕加载时,我需要突出显示之前选择的项目。我没有成功尝试在 VM 的构造函数中设置“SelectedPartTypes”属性,假设双向绑定会处理它。是否有一种简单的方法可以显示控件加载时选择了哪些项目?

【问题讨论】:

    标签: wpf data-binding listview gridview selecteditem


    【解决方案1】:

    不能在 ListBoxItem 样式中绑定IsSelected 属性吗?

    <Style TargetType="ListBoxItem">
        <Setter Property="IsSelected" Value="{Binding IsSelected}" />
    </Style>
    

    如果您的数据对象没有跟踪选择的属性,如果当前对象在 SelectedPartTypes 内,您可能需要使用转换器返回 true

    【讨论】:

    • 我试过这个...我向我的 PartType 对象添加了一个 IsSelected 属性,并将每个选定对象的属性设置为 true。当屏幕加载时,无论 IsSelected 是真还是假,gridview 中都不会出现任何选择。
    • @drowned 如果没有local:DataGridService.SelectedItems 绑定,它可以工作吗?
    • 是的,它有效。当我发现用于处理多个选定项目的疯狂附加行为选项时,我不敢相信我之前没有遇到过这个解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多