【问题标题】:How to pass grid property to ViewModel without Binding in WPF如何在不绑定 WPF 的情况下将网格属性传递给 ViewModel
【发布时间】:2019-03-15 14:46:46
【问题描述】:

我正在使用 DevExpress XAML 框架。在我的网格中,我有 CheckBoxSelectorColumn,它是随框架提供的(我找到的进行多项选择的最简单方法)。

我不能使用绑定来获取 SelectedItems,而是在我的 main.xaml.cs 中使用 [gridName].SelectedItems。

有没有办法将 SelectedItems 传递给 MainViewModel?

[编辑]

很抱歉,我的问题不清楚且没有代码示例。 我将提供我的部分代码。

MyUserControl.xaml

<dxg:GridControl Name="grid" SelectionMode="MultipleRow" AutoGenerateColumns="None" EnableSmartColumnsGeneration="false" ItemsSource="{Binding BugList}" Margin="0,0,0,20" Grid.RowSpan="2">
            <dxg:GridControl.View>
                <dxg:TableView
                               AllowEditing="False" ShowCheckBoxSelectorColumn="True"
                               HorizontalScrollbarVisibility="Auto"
                               />
            </dxg:GridControl.View>
            <dxg:GridColumn FieldName="Description" Header="Description"/>

我使用ShowCheckBoxSelectorColumn 属性在每行中获取一个带有复选框的列以进行多选。 该属性的缺点,同时也有一个好处,就是选定的项目不能通过绑定传递(如果我的研究是正确的),但它们可以通过以下方式轻松传递到视图后端:

MyUserControl.xaml.cs

 public void EntriesHandle_Button()
        {
            if (grid.SelectedItems.Count != 0)
            {
                if (DXMessageBox.Show("Do you really want to remove selected Items from your List?", "Question",   
                            MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    //remove selected entries
                }
            }
            else { MessageBox.Show("Please select entries", "Warning"); }      
        }

使用grid.SelectedItems,我可以在视图的 checkboxColumn 中获得这些项目。 我想将 SelectedItems 传递给 ViewModel,以便从 RibbonComponent 中的 Button 访问它们。那是我的问题。

[解决方案]

我使用 DevExpress.Mvvm.Messenger 从 RibbonControl 调用 EntriesHandle_Button()

ribbon.xaml

<dxb:BarButtonItem Name="BRemove" Content="Remove selected">
                            <dxmvvm:Interaction.Behaviors>
                                <dxmvvm:EventToCommand EventName="ItemClick" Command="{Binding RemoveEntries_OnClick}"/>
                            </dxmvvm:Interaction.Behaviors>
                        </dxb:BarButtonItem>

RibbonViewModel.cs

public class RibbonViewModel : ViewModelBase
    {          
        private readonly IRibbonCommands _ribbonCommands;    
        public RibbonViewModel(IRibbonCommands ribbonCommands)
        {
            _ribbonCommands = ribbonCommands;
            RemoveEntries_OnClick = new DelegateCommand(_ribbonCommands.RemoveEntries);
        }

RibbonCommands.cs

public class RibbonCommands : IRibbonCommands
    {
        public void RemoveEntries()
        {
            string message = "remove";
            Messenger.Default.Send(message);
        }
    }

MyUserControl.xaml.cs

public partial class MyUserControl: UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
            DataContext = new MyUserControlViewModel();
            Messenger.Default.Register<string>(this, EntriesHandle_Button);
        }
       public void EntriesHandle_Button(string message)
        {
            if (grid.SelectedItems.Count != 0)
            {
              switch (message)
                {
               case "remove":
                if (DXMessageBox.Show("Do you really want to remove selected Items from your List?", "Question",   
                            MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    //remove selected entries
                }
             break;
              }
            }
            else { MessageBox.Show("Please select entries", "Warning"); }      
        }
}


【问题讨论】:

  • 我认为是这样的,我没有使用 DevExpress。 stackoverflow.com/a/22392637/3225
  • Main.xaml 的 DataContext 是否设置为您的 MainViewModel?也许您可以在 Main.xaml.cs 中执行 (DataContext as MainViewModel).YourSelectedItemsProperty = [gridName].SelectedItems。然而,适当的 MVVM 解决方案会更好;)
  • 如果它是一个合适的 MVVM,那么您可以为每个项目提供具有IsSelected 属性的视图模型。该属性可以由视图设置,甚至可以直接绑定到其他一些控制属性(我不使用 DevExpress),就像它通常为 ListViewItem (example) 所做的那样。
  • 请考虑提供minimal reproducible example。另外不要忘记阅读How to Ask 一个好问题。
  • 可以将 SelectedItems 绑定到您的 ViewModel,您需要使用 ObservableCollection 属性。

标签: c# wpf xaml devexpress


【解决方案1】:

GridControl 在使用CheckBoxSelectorColumn 时完全支持SelectedItems 绑定。一件重要的事情是绑定到 SelectedItems 的项目应该在视图模型级别初始化。这意味着如果您将 SelectedItems 绑定到属性 SelectedCustomers,则需要使用空集合初始化 SelectedCustomers。例如 ObservableCollection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2016-08-01
    • 1970-01-01
    • 2011-02-01
    • 2023-01-24
    • 2019-02-28
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多